MS SQL Server で Open Query を自動化する
このテーブルと一連のストアド プロシージャを使用すると、Oracle および Progress データベースから SQL Server へのデータ転送を自動化できます。
Get Open クエリ モジュールの作成
テーブル、ストアド プロシージャ、リンク サーバー オブジェクト、およびジョブを作成するための知識と権限があることを前提としています。これがないと、サポートできない問題が発生する可能性があります。
これを実行するときは、共有機能と保守オブジェクトを保持するユーティリティ タイプのデータベースに配置する傾向があります。
最初のタスクは、すべてのデータ フローを管理するためのマスター テーブルを作成することです。いくつかの列を監視する必要があります。
- GetOpenQueryStream - これは、一連のテーブルをバッチ処理できるようにする整数フィールドであり、列 GetOpenQueryOrder で設定された順序で実行されます
- GetOpenQueryName - コードを変更していない限り、GetOpenQuery_Progress または GetOpenQuery_Oracle のいずれかになります。
- GetOpenQueryLinkServ - サーバー オブジェクトで設定する必要があるリンク サーバー名です。
- GetOpenQuerySourceSchema - ソース データベース スキーマです
- GetOpenQueryDatabase、GetOpenQuerySchema、GetOpenQueryTable は、データのコピー先を設定する 3 つの部分の識別子を形成します。
- WHERE、INNER、および TOP ステートメントを追加できます
- GetOpenQuerySkipCols - インポート時にテーブルから列を削除します。
Create Table
CREATE TABLE dbo.GetOpenQuery(
GetOpenQueryID int IDENTITY(1,1) NOT NULL,GetOpenQueryStream int NULL,GetOpenQueryName nvarchar(100) NULL,GetOpenQueryLinkServ nvarchar(100) NULL,GetOpenQueryDatabase nvarchar(100) NULL,GetOpenQuerySchema nvarchar(max) NULL,GetOpenQueryTable nvarchar(100) NULL,GetOpenQueryWHERE nvarchar(1000) NULL,GetOpenQueryTOP nvarchar(100) NULL,GetOpenQuerySourceSchema nvarchar(100) NULL,GetOpenQuerySkipCols nvarchar(max) NULL,GetOpenQueryINNER nvarchar(max) NULL,GetOpenQuerySkipTruncate bit NULL DEFAULT ((0)),GetOpenQueryOrder bit NULL DEFAULT ((0)))
ハブ
その後、ジョブをフックしてストリーム ID を渡し、このストアド プロシージャを介して関連するテーブルをループすることができます。これは上記の表をループし、Oracle または Progress リンク サーバーの関連コードを起動します。
これは、他のすべてのジョブを呼び出すことができるハブになります。
Create Stored Procedure
CREATE PROC [dbo].[GetOpenQuery_Data](@Stream INT) AS BEGINDECLARE @GetOpenQueryName NVARCHAR(100),@GetOpenQueryLinkServ NVARCHAR(100),@GetOpenQueryDatabase NVARCHAR(100),@GetOpenQuerySchema NVARCHAR(MAX),@GetOpenQueryTable NVARCHAR(100),@GetOpenQueryWHERE NVARCHAR(1000),@GetOpenQueryTOP NVARCHAR(100),@SrcScheme NVARCHAR(100),@SkipCols NVARCHAR(MAX),@GetOpenQueryINNER NVARCHAR(MAX),@GetOpenQuerySkipTruncate BIT DECLARE @SQL NVARCHAR(MAX),@SQLRows BIGINT,@SQLRowCount BIGINT,@SQLOutPut NVARCHAR(100)='@SQLRows BIGINT' DECLARE C CURSOR FAST_FORWARD FORSELECTGetOpenQueryName, GetOpenQueryLinkServ, GetOpenQueryDatabase, GetOpenQuerySchema, GetOpenQueryTable,GetOpenQueryWHERE, GetOpenQueryTOP, GetOpenQuerySourceSchema, GetOpenQuerySkipCols, GetOpenQueryINNER, GetOpenQuerySkipTruncateFROM GetOpenQueryWHERE GetOpenQueryStream=@StreamORDER BY GetOpenQueryOrderOPEN CFETCH NEXT FROM CINTO @GetOpenQueryName,@GetOpenQueryLinkServ,@GetOpenQueryDatabase,@GetOpenQuerySchema,@GetOpenQueryTable,@GetOpenQueryWHERE,@GetOpenQueryTOP,@SrcScheme,@SkipCols,@GetOpenQueryINNER,@GetOpenQuerySkipTruncateWHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SET @SQL='EXEC '+@GetOpenQueryName+' '''+ @GetOpenQueryLinkServ+''','''+ @GetOpenQueryDatabase+''','''+ @GetOpenQuerySchema+''','''+ @GetOpenQueryTable+''','+ ISNULL(NULLIF(''''+@GetOpenQueryWHERE+'''',''),'NULL')+','+ ISNULL(NULLIF(@GetOpenQueryTOP,''),'NULL')+','+ ISNULL(NULLIF(@SrcScheme,''),'NULL')+','+ ISNULL(NULLIF(''''+@SkipCols+'''',''),'NULL')+','+ ISNULL(NULLIF(''''+@GetOpenQueryINNER+'''',''),'NULL')+','+(CASE WHEN @GetOpenQuerySkipTruncate=1 THEN '1' ELSE '0' END) EXEC sp_executesql @SQL SET @SQLRows=@@ROWCOUNT SELECT @SQLRows END TRY BEGIN CATCH PRINT @GetOpenQueryLinkServ+'; Table '+@GetOpenQueryTable+' Failed' END CATCH PRINT @SQL FETCH NEXT FROM C INTO @GetOpenQueryName,@GetOpenQueryLinkServ,@GetOpenQueryDatabase,@GetOpenQuerySchema,@GetOpenQueryTable, @GetOpenQueryWHERE,@GetOpenQueryTOP,@SrcScheme,@SkipCols,@GetOpenQueryINNER,@GetOpenQuerySkipTruncateEND CLOSE C;DEALLOCATE C;ENDGO