2017-11-02 9 views
0

コンマで区切られた文字列として渡されるアドレス情報を解析しようとしています。私は、私の知る限り、この擬似サンプルにT-SQLトリガーで新しいバッチレコードのみを更新します

CREATE TRIGGER aftInsParseAddress 
AFTER INSERT 
AS 
    DECLARE @address VARCHAR(100), 
     @city VARCHAR(100), 
     @stateZip VARCHAR(100), 
     @source varchar(100), 
     @state varchar(2) , 
     @zip varchar(5), 
     @country1 varchar(10) , 
     @country varchar(3) 

    SET @source = (SELECT AddressSourceA 
        FROM table 
        WHERE ID = 'GUID-GUID-GUID-GUID-GUID' AND Exported = 0) 

    SELECT 
     @address = LEFT(@source, CHARINDEX(',', @source) - 1), 
     @city = (SUBSTRING (@source, CHARINDEX(',', @source) + 2 , 
            CHARINDEX(',', @source, CHARINDEX(',', @source) + 1) - LEN(LEFT(@source, CHARINDEX(',', @source))) -2)), 
     @stateZip = SUBSTRING(@source, CHARINDEX(',', @source, LEN(@city) + LEN(@address)), 10), 
     @state = (SUBSTRING(@stateZip, 3 ,4)), 
     @zip = (SUBSTRING(@stateZip, 6, 9)), 
     @country1 = (SUBSTRING(@source, (CHARINDEX(',', @source, LEN(@address) + LEN(@statezip) + LEN(@city))), 5)), 
     @country = (SUBSTRING(@country1, 3, 7)) 

    UPDATE SameTableInsertedInto 
    SET Address = @address, City = @city, 
     State = @state, Zip = @zip, 
     Country = @country 
    WHERE id IN (SELECT ID FROM inserted); 

を使用して必要な情報をダウン解析するように私は私の@source =「1600ペンシルベニアアベニューNW、ワシントンD.C. 20500、USA」などの文字列で始まるでしょう

を得ています値で終わる

は私は作成者が彼らの端にアドレスを解析できないことをWebフォームからこのデータをインポートしていますすなわち

1600 Pennsylvania Ave NW 
Washington 
DC 
20500 
USA 

それらを必要とする方法を解析されました。結果として、私は各アドレスフィールドをそれ自身の変数に分割する必要があります。私はこれを行うサンプルを構築し、挿入後にトリガーでこれを実装しようとした後、宛先テーブルの同じフィールドを更新しました。

1レコードを正常に起動するためのサンプルを作成することができますが、より多くの場合、複数のレコードをインポートすることになります。私は私のジレンマを修正するために、これで次に頭を付けるべきか分からない。ストアドプロシージャまたは関数内のデータを解析する必要がありますか?

注意することも重要です。テーブルにレコードを挿入し、新しい値が入る同じテーブル内の値を更新した後、このトリガを実行しようとしています。

ありがとうございました!

+2

['INSERTED'テーブルは複数の行を持つことができます](https://docs.microsoft.com/en-us/sql/relational-databases/triggers/create-dml-triggers-to-handle-multiple-rowsそのデータを処理するためにトリガーを修正する必要があります。 解析ロジックを[インラインテーブル値関数]に入れることをお勧めします。(https://technet.microsoft.com/en-us/library/ms189294(v=sql.105).aspx)懸念の分離が役立ちます。 –

+1

さらに、トリガで長時間の文字列操作を行うことはお勧めできません.... –

+0

トリガで実行するのではなく、あとでスケジュールされたprocでバッチ処理することをお勧めします。トリガのエラー(およびダーティデータの部分文字列を使用すると、エラーが発生することはほとんどありません)は、レコード全体の挿入に失敗します。あなたはそれが起こることを望んでいません。 –

答えて

0

アドレスの解析は本当に難しいです。 はここで良いの参照を参照してください: How to parse freeform street/postal address out of text, and into components

あなたが(代わりにMelissaDataサービスを使用しての)これを行うための良いアルゴリズムを見つけた場合、言った、あなたはSQLトリガー内でそれを実行すると判断された場合、その後、あなたは最高置きますコードをCLRストアドプロシージャに追加します。 CLR Stored procでは、TSQLではなく、そのようなアルゴリズムを実装するためにはるかに優れた言語(C#、VB)の利点があります。 ここにジョブを実行するライブラリ(YMMV)https://usaddress.codeplex.com

幸運があります。

+0

提案していただきありがとうございます。私は主にトリガ/ストアドプロシージャを介してこれを記述しようとしています。このSQLを実行する基になるアプリケーションは、MS-Accessアプリケーションです。私は、SQLからSQLへレコードをインポートできるクローズドループを構築しようとしています。基礎となるVBAコードによって呼び出されます。理想的には、C#またはVBで何かを書くのはいいですが、それは追加のセットアップが必要な場合があります。その点に着目すれば、LINQを使ってC#ライブラリを実装しようと思っていますが、これを簡単に達成できると思います。しかし、これは現在私のプロジェクトではなく、この作業の範囲を拡張するだけです。 –

関連する問題