Automatisieren Sie die offene Abfrage in MS SQL Server
Erstellen der Get Open-Abfragemodule
Wir gehen davon aus, dass Sie das Wissen und die Berechtigung haben, Tabellen, gespeicherte Prozeduren, Linked-Server-Objekte und Jobs zu erstellen, ohne dies kann es zu Problemen kommen, bei denen wir Ihnen nicht helfen können.
Wenn wir dies ausführen, platzieren wir es in der Regel in einer Datenbank vom Typ Dienstprogramme, in der wir gemeinsam genutzte Funktionen und Wartungsobjekte aufbewahren.
Die erste Aufgabe, die wir haben, besteht darin, eine Haupttabelle zu erstellen, um den gesamten Datenfluss zu verwalten, einige der Spalten, nach denen Sie Ausschau halten sollten, umfassen;
- GetOpenQueryStream – Dies ist ein ganzzahliges Feld, mit dem Sie Tabellensätze stapelweise verarbeiten können, und wird in der Reihenfolge ausgeführt, die in der Spalte „GetOpenQueryOrder“ festgelegt ist
- GetOpenQueryName – Dies sollte entweder GetOpenQuery_Progress oder GetOpenQuery_Oracle sein, es sei denn, Sie haben den Code angepasst.
- GetOpenQueryLinkServ – Der Name des verknüpften Servers, der in den Serverobjekten eingerichtet werden muss
- GetOpenQuerySourceSchema – Das Schema der Quelldatenbank
- GetOpenQueryDatabase, GetOpenQuerySchema, GetOpenQueryTable bilden die dreiteilige Kennung dafür, wohin die Daten kopiert werden sollen.
- Sie können WHERE-, INNER- und TOP-Anweisungen hinzufügen
- GetOpenQuerySkipCols – Dadurch werden die Spalten beim Importieren aus der Tabelle entfernt.
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)))
Ein Hub
Jobs können dann so eingebunden werden, dass sie eine Stream-ID übergeben und die relevanten Tabellen über diese gespeicherte Prozedur durchlaufen. Dadurch wird die obige Tabelle durchlaufen und der relevante Code für Oracle oder Progress Linked Server ausgelöst.
Dieser wird dann zur Drehscheibe, über die alle anderen Jobs aufgerufen werden können.
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