Offene Abfrage in MS SQL Server automatisieren
Erstellen der Get Open-Abfragemodule
Wir gehen davon aus, dass Sie über das Wissen und die Berechtigung zum Erstellen von Tabellen, Stored Procedures, Linked Server-Objekten und Jobs verfügen. Andernfalls kann es zu Problemen kommen, bei denen wir Ihnen nicht weiterhelfen können.
Wenn wir dies ausführen, neigen wir dazu, es in einer Datenbank des Typs Dienstprogramme abzulegen, in der wir gemeinsame Funktionen und Wartungsobjekte speichern.
Die erste Aufgabe, die wir haben, besteht darin, eine Mastertabelle zu erstellen, um den gesamten Datenfluss zu verwalten, einige der Spalten, auf die Sie achten müssen, enthalten;
- GetOpenQueryStream - Dies ist ein ganzzahliges Feld, mit dem Sie Tabellensätze im Stapel verarbeiten können, und wird in der in der Spalte GetOpenQueryOrder festgelegten Reihenfolge ausgeführt
- GetOpenQueryName - Dies sollte entweder GetOpenQuery_Progress oder GetOpenQuery_Oracle sein, es sei denn, Sie haben den Code angepasst.
- GetOpenQueryLinkServ - ist der Name des Verbindungsservers, der in Serverobjekten eingerichtet werden muss
- GetOpenQuerySourceSchema - Ist das Quelldatenbankschema
- GetOpenQueryDatabase, GetOpenQuerySchema, GetOpenQueryTable bilden den dreiteiligen Bezeichner dafür, wohin die Daten kopiert werden sollen.
- Sie können WHERE-, INNER- und TOP-Anweisungen hinzufügen
- GetOpenQuerySkipCols - dies entfernt die Spalten beim Importieren aus der Tabelle.
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 angehängt werden, um eine Stream-ID zu übergeben und die relevanten Tabellen über diese gespeicherte Prozedur zu durchlaufen. Dadurch wird die obige Tabelle durchlaufen und der relevante Code für Oracle- oder Progress-Verbindungsserver ausgelöst.
Dieser wird dann zum Hub, über den 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