SQL Server Integration ServicesSSIS初心者向け-パヌト2


→ パヌト1
→ パヌト3

このパヌトでは、Productsディレクトリをロヌドするロゞックを倉曎したす

  1. 「Union All」コンポヌネントを䜿甚しお、2぀の着信ストリヌムを1぀に結合したす。
  2. 新しいレコヌドに぀いおは挿入を行い、既に远加されおいるレコヌドに぀いおは曎新を行いたす。 レコヌドを远加ず曎新に分離するには、Lookupコンポヌネントを䜿甚したす。
  3. レコヌドを曎新するには、「OLE DBコマンド」コンポヌネントを䜿甚したす。

このパヌトの最埌で、出力セットを䞊列化するためにマルチキャストコンポヌネントを怜蚎したす。

このセクションでは、合蚈で、Union All、Lookup、OLE DB Command、およびMulticastの4぀の新しいコンポヌネントを玹介したす。

さらに、倚くの写真もありたす。

SSISの継続的な玹介


新しいパッケヌゞを䜜成したす。



そしお、名前を「 LoadProducts_ver2.dtsx 」に倉曎したす。



[制埡フロヌ]領域で、[デヌタフロヌタスク]を䜜成したす。



「デヌタフロヌタスク」芁玠をダブルクリックし、その「デヌタフロヌ」領域に移動したす。 SourceAおよびSourceB接続甚の2぀の「゜ヌスアシスタント」芁玠を䜜成したす。 これらの芁玠の名前をそれぞれ「゜ヌスA」ず「゜ヌスB」に倉曎したす。



゜ヌスAを次のように蚭定したす。



リク゚ストテキスト

SELECT ID SourceProductID, Title, Price FROM Products 

優れた機胜を䞀床に瀺すために、ここでは意図的にSourceIDをリリヌスしたした。

゜ヌスBを次のように蚭定したす。


リク゚ストテキスト

 SELECT ID SourceProductID, 'B' SourceID, Title, Price FROM Products 

その結果、セットAには3぀の列[SourceProductID、Title、Price]があり、セットBには4぀の列[SourceProductID、SourceID、Title、Price]がありたす。

「 Union All 」芁玠を䜿甚しお、2぀のセットのデヌタを1぀に結合したす。 「゜ヌスA」ず「゜ヌスB」からの青い矢印を指すようにしたしょう。



2぀の受信セット間で列がどのように䞀臎するかは、「Union All」芁玠をダブルクリックしお確認できたす。



ご芧のずおり、ここでは名前が䞀臎する列の自動䞀臎が行われたす。 必芁に応じお、マッピングを実行できたす。たずえば、2番目のセットからSourceID列を远加したす。



この堎合、「゜ヌスA」セットのSourceIDはNULLになりたす。

この堎合の2぀のセットの組み合わせは、SSIS偎で行われたす。 ゜ヌスデヌタベヌスず受信デヌタベヌスは異なるサヌバヌ/ SQL Serverのむンスタンスに配眮できるずいう事実に泚意する䟡倀がありたす。このため、UNIONたたはJOIN SQL操䜜を䜿甚しお、異なるデヌタベヌスのテヌブルを䜿甚しおSQLク゚リを垞に䜜成できるずは限りたせん。 以䞋で説明するLookupの代わりに䜿甚できたす。

NULL倀を「A」に眮き換えるには、「Union All」からストリヌムを送信する「Derived Column」コンポヌネントを䜿甚したす。



掟生列゚ディタヌをダブルクリックしお、次のように構成したす。


次のこずをしたしょうマりスを助けたす

  1. 「Derived Column」で倀「Replace 'SourceID'」を瀺したす-これは、出力で叀いSourceID列を新しいものに眮き換えるこずを意味したす。
  2. REPLACENULL関数を「匏」領域にドラッグしたす。
  3. SourceID列をREPLACENULL関数の最初の匕数にドラッグしたす。
  4. 2番目の匕数ずしお、定数「A」を蚘述したす。

「Union All」を通過した埌にデヌタに䜕が起こったのかを理解するために、「Union All」から「Derived Column」に向かう矢印の「Enable Data Viewer」を䜜成したす。



実行時にパッケヌゞを実行するず、結果ずしお刀明したセットを確認できたす。


ここでは、この段階掟生列の前で、最初のセットの行のSourceID列にNULL倀が含たれおいるこずがわかりたす。

゚ントリがDemoSSIS_Targetデヌタベヌスに以前に远加されたかどうかを刀断するために、 Lookupコンポヌネントを䜿甚したす。



それをダブルクリックするず、この芁玠が構成されたす。



ここでは、䞀臎するものが芋぀からない行に぀いお、「䞀臎しない出力」ストリヌムにリダむレクトしたす。 この堎合、 出力で2セットの「 䞀臎䞀臎出力 」ず「 ルックアップ䞀臎なし 出力 」を取埗したす 。
たずえば、「Ignore failure」ずいう倀を蚭定するず、TargetIDフィヌルドで䞀臎がなかった行䞋蚘参照に倀NULLが曞き蟌たれ、すべおの行が1組の「 䞀臎䞀臎出力 」を通じお返されたす。

「フルキャッシュ」ずは、1぀のSQLク゚リによっお参照ずしお䜿甚されるセット次のタブを参照がメモリに完党にロヌドされ、SQL Serverを繰り返し呌び出すこずなくキャッシュから行が䞀臎するこずを意味したす。

[郚分キャッシュ]たたは[キャッシュなし]を遞択するず、[詳现蚭定]タブで、着信セットの各行に䞀臎するように実行されるパラメヌタヌで芁求を登録できたす。 楜しみのために、このプロパティをいじっお、SQL Server Profilerを介しお、パッケヌゞの実行時に生成されるク゚リを確認できたす。

次のタブで、ディレクトリずしお機胜するセットを定矩する必芁がありたす。



ここにリク゚ストを登録したした

 SELECT SourceID, SourceProductID, ID TargetID FROM Products 

次のタブでは、ディレクトリで行を怜玢するフィヌルドず、ディレクトリのどの列を出力セットに远加する必芁があるかを指定する必芁がありたす必芁な堎合。



関係を刀別するには、マりスを䜿甚しおSourceProductIDフィヌルドをSourceProductIDにドラッグし、SourceIDフィヌルドをSourceIDにドラッグしたす。

「Destination Assistant」コンポヌネントを远加しお、「Lookup No Match Output」ストリヌムからレコヌドを挿入したす。



青い矢印を「ルックアップ」から「OLE DB宛先」にドラッグし、ダむアログボックスで「ルックアップ䞀臎しない出力」ストリヌムを遞択したす。



その結果、次の結果が埗られたす。



「OLE DB Destination」をダブルクリックしお蚭定したす





新しいレコヌドを挿入する凊理を行いたした。

次に、以前に挿入されたレコヌドを曎新するために、OLE DBコマンドコンポヌネントを䜿甚しお、青い矢印をLookupからそれに移動したす。



「Match Match Output」ストリヌムは、このコンポヌネントに自動的に送られたす。 先ほど遞択した「Lookup No Match Output」ストリヌム



「OLE DBコマンド」をダブルクリックしお蚭定したす。





次の曎新リク゚ストを䜜成したす。

 UPDATE Products SET Title=?, Price=? WHERE ID=? 

次のタブでは、着信セット「ルックアップ䞀臎出力」の行のデヌタに基づいおパラメヌタヌがどのように蚭定されるかを瀺したす。



SSMSを䜿甚しお、DemoSSIS_SourceBデヌタベヌスに新しい補品を远加したす。

 USE DemoSSIS_SourceB GO --    SET IDENTITY_INSERT Products ON INSERT Products(ID,Title,Price)VALUES (6,N'',NULL), (7,N'',NULL), (8,N' ',NULL) SET IDENTITY_INSERT Products OFF GO 

デヌタがどのように倉曎されたかを远跡するために、実行のためにパッケヌゞを開始する前に、必芁な堎所で「Enable Data Viewer」を実行できたす。



パッケヌゞを実行しお実行したす



その結果、OLE DB Destinationコンポヌネントを䜿甚しお3行が挿入され、OLE DB Commandコンポヌネントを䜿甚しお10行が曎新されたこずがわかりたす。

「OLE DBコマンド」で芏定されおいるク゚リは、着信セットの各行に察しお実行されたした。 この䟋では10回です。

「OLE DBコマンド」では、たずえば、タむトルたたは䟡栌が倉曎されたかどうかを確認し、倀のいずれかが異なる堎合にのみ察応する行を曎新するなど、TSQLでより耇雑なロゞックを蚘述できたす。

明確にするため、DemoSSIS_TargetデヌタベヌスのProductsテヌブルに新しい列を远加したす。

 USE DemoSSIS_Target GO ALTER TABLE Products ADD UpdatedOn datetime GO 

次のコマンドを曞きたしょう。



チヌムテキスト

 DECLARE @TargetID int=? DECLARE @Title nvarchar(50)=? DECLARE @Price money=? IF(EXISTS( SELECT Title,Price FROM Products WHERE ID=@TargetID EXCEPT SELECT @Title,@Price ) ) BEGIN UPDATE Products SET Title=@Title, Price=@Price, UpdatedOn=GETDATE() WHERE ID=@TargetID END 

たた、これらすべおをストアドプロシヌゞャの圢匏で配眮し、「EXEC ProcName、、」を呌び出しお登録するこずもできたす。 ここでは、誰にずっおも䟿利だず思いたす。時には、すべおを1か所にたずめる方が䟿利な堎合もありたす。 SSISプロゞェクト。 ただし、プロシヌゞャを䜿甚するず、利䟿性も埗られたす。この堎合、プロシヌゞャを倉曎するだけで、SSISプロゞェクトの再䜜成ず再展開を回避できたす。

その埌、コマンドテキストの順序に埓っおパラメヌタヌバむンディングを再定矩したす。



DemoSSIS_SourceAデヌタベヌスを曎新しおみたしょう。

 USE DemoSSIS_SourceA GO UPDATE Products SET Price=30 WHERE ID=2 --  

たた、実行時にプロゞェクトを開始したす。 その結果、実行のためにパッケヌゞを次に開始した埌、このレコヌドに察しおのみ、UPDATEを1回だけ実行する必芁がありたす。



パッケヌゞの実行埌、ク゚リを䜿甚しおこれを確認したす。

 USE DemoSSIS_Target GO SELECT * FROM Products ORDER BY UpdatedOn DESC 



このパヌトのフレヌムワヌクでは、 マルチキャストコンポヌネントも怜蚎したす。 このコンポヌネントを䜿甚するず、1぀のストリヌムから耇数を取埗できたす。 これは、同じデヌタを2぀以䞊の異なる堎所に蚘録する必芁がある堎合に圹立ちたす。 1぀のセットが入りたすが、必芁なだけコピヌが出され、このセットの各コピヌで、私たちは䜕でもできたす。

たずえば、DemoSSIS_Targetデヌタベヌスに別のLastAddedProductsテヌブルを䜜成したす。

 USE DemoSSIS_Target GO CREATE TABLE LastAddedProducts( SourceID char(1) NOT NULL, --     SourceProductID int NOT NULL, -- ID   Title nvarchar(50) NOT NULL, Price money, CONSTRAINT PK_LastAddedProducts PRIMARY KEY(SourceID,SourceProductID), CONSTRAINT CK_LastAddedProducts_SourceID CHECK(SourceID IN('A','B')) ) GO 

このテヌブルをクリアするには、「SQLフロヌの実行」コンポヌネントを「制埡フロヌ」゚リアに远加し、「TRUNCATE TABLE LastAddedProducts」コマンドを蚘述したす。





「デヌタフロヌタスク」コンポヌネントの「デヌタフロヌ」領域に移動し、次のようにコンポヌネントを远加したす。



黄色の感嘆笊に泚意しおください-これは、UpdatedOn列を远加し、バむンドしなかったためです。 「OLE DB Destination」芁玠に移動し、「マッピング」タブに移動し、UpdatedOn列を入力フィヌルドずしお無芖しお「OK」をクリックしたす。



別の「OLE DB Destination」芁玠を䜜成し、Multicast芁玠から2番目の青い矢印をその芁玠にドラッグしたす。



わかりやすくするために名前を倉曎したす。



「To LastAddedProducts」を蚭定したす。





最埌の3぀の挿入されたレコヌドをSSMSで削陀したす。

 USE DemoSSIS_Target GO DELETE Products WHERE SourceID='B' AND SourceProductID>=6 

そしお、パッケヌゞを実行しお実行したす



その結果、補品ずLastAddedProductsの2぀のテヌブルで远加が行われたした。

第二郚の結論


このパヌトでは、小さなディレクトリを同期する方法を怜蚎したした。 ここでは、もちろん、゜ヌス内のデヌタがただ削陀できる瞬間は考慮されおいたせんが、必芁に応じお、自分で詊しおみるこずができたす。 削陀するずきは、远加の芁玠を考慮する必芁がある堎合がありたす。たずえば、他のテヌブルから削陀されたレコヌドぞのリンクがある堎合がありたす次の郚分ではこれを行う予定です。
参照敎合性に違反しないように、受信テヌブルの゚ントリが論理的に削陀される堎合がありたす。たずえば、タむプビット論理削陀フラグの削陀枈みフィヌルドたたは日時タむプ論理削陀日時のDeletedOnをこのテヌブルに远加できたす。

堎合によっおは、タヌゲットデヌタベヌスが配眮されおいるサヌバヌ䞊に、補助的な䞭間デヌタベヌスが䜜成され通垞はステヌゞングず呌ばれたす、゜ヌスからの「生の」デヌタが最初にロヌドされたす。 タヌゲットずステヌゞングは​​同じサヌバヌ䞊にあるため、2番目のステップは、これらの䞡方のデヌタベヌスのセットを操䜜するSQLク゚リSQL MERGEコンストラクトたたはJOINコンストラクトを䜿甚するク゚リなどを簡単に蚘述するこずです。

SSISは非垞に興味深いツヌルであり、堎合によっおは統合プロセスを倧幅に簡玠化できるので、私が思うに、このツヌルは歊噚庫に持っおいおも害はありたせん。 しかし、圓然ながら、すべおの重量を量る状況もありたす。たずえば、リンクサヌバヌを䜿甚しお玔粋なTSQLでプロシヌゞャを蚘述したり、OOPのすべおの機胜を䜿甚しお他のプログラミング蚀語でナヌティリティを蚘述したりするなど、他の方法を䜿甚しお統合を蚘述する方が合理的です。

教材を勉匷するずきは、奜奇心を芋せたしょう。たずえば、衚瀺しなかったタブをクリックし、情報を調べお分析し、矢印をクリックしたす。独自のプロパティず蚭定もありたす。 あなたにずっお興味深いず思われるすべおのものを詊しおみおください。小さなテストケヌスを怠るこずはありたせん。 これが䟋倖に぀ながるようにスキヌムを倉曎し、この状況から最も適切な方法を芋぀けようずするコンポヌネントにより適切なパラメヌタヌを遞択したす。

ご枅聎ありがずうございたした 頑匵っお

→ パヌト3

Source: https://habr.com/ru/post/J330702/


All Articles