Wie erstelle ich eine temporäre Tabelle für eine dynamische Abfrage, so dass ich BCP die Ausgabe

Ich versuche, eine gespeicherte Prozedur zu schreiben, die alle .sql fileen ausführt, die sich in einem Ordner befinden, und gibt dann die Ergebnisse an CSV-fileen aus.

Mein Code:

 DECLARE @Table table( [FileName] varchar(100), depth int, isFile int ) DECLARE @Result int DECLARE @FileName VARCHAR(100) DECLARE @exportFile VARCHAR(100) DECLARE @ExportPath VARCHAR(100) DECLARE @SQLText VARCHAR(MAX) DECLARE @FilePath VARCHAR(100) DECLARE @FULLPATH VARCHAR(200) DECLARE @BULKEXEC NVARCHAR(MAX) DECLARE @Cmd nvarchar(1000) SET @FilePath = 'c:\temp' SET @ExportPath = 'c:\temp\output' INSERT INTO @Table EXEC master..xp_dirtree @FilePath,1,1 DELETE FROM @Table WHERE isFile=0 DECLARE FileList CURSOR STATIC FOR SELECT [FileName] FROM @Table WHERE FileName LIKE '%.sql' OPEN FileList FETCH FIRST FROM FileList INTO @FileName WHILE @@Fetch_Status = 0 BEGIN SET @exportFile = REPLACE(@FileName,'.sql','.csv') SET @FULLPATH = @FilePath + '\' + @FileName SET @BULKEXEC = 'SELECT @SQLText = BulkColumn FROM OPENROWSET(BULK ''' + @FULLPATH + ''', SINGLE_BLOB) as x' EXEC sp_ExecuteSQL @BULKEXEC, N'@SQLText VARCHAR(MAX) output ', @SQLText output EXEC (@SQLText) SET @Cmd = 'bcp "SELECT * FROM ##Temptable" queryout "' + @ExportPath + '\' + @exportFile + '" -c -t, -T' EXEC @Result = master..xp_cmdshell @cmd FETCH NEXT FROM FileList INTO @FileName END CLOSE FileList DEALLOCATE FileList 

Dies führt derzeit die fileen aus, aber ich vermisse das mittlere Bit, das die Ergebnisse in das ##Temptable .

Kann jemand helfen?

Schauen Sie sich das folgende Beispiel an. Es verwendet eine Abfrage in @sqltext , eine ganz generische Abfrage, die Informationen aus dem Schema INFORMATION_SCHEMA ( tables und columns ) auswählt.

Diese Abfrage wird dann geändert, um die Ergebnisse in eine globale temporäre Tabelle ##tt einzufügen, indem sie das erste FROM Schlüsselwort sucht und INTO ##tt an der richtigen Stelle einfügt. Die geänderte Abfrage wird ausgeführt, um die Ergebnisse der Abfrage in die temporäre Tabelle einzufügen.

Schließlich werden die Ergebnisse in eine Textdatei mit der Prozedur xp_cmdshell mit einem BCP Befehl geschrieben.


 DECLARE @i INT=1; WHILE @i<10 BEGIN DECLARE @sqltext NVARCHAR(MAX); IF @i%2=1 SET @sqltext='SELECT*FROM INFORMATION_SCHEMA.tables'; ELSE SET @sqltext='SELECT*FROM INFORMATION_SCHEMA.columns'; DECLARE @ii INT; SET @ii=CHARINDEX('FROM',@sqltext); SET @sqltext=LEFT(@sqltext,@ii-1)+' INTO ##tt '+SUBSTRING(@sqltext,@ii,LEN(@sqltext)); EXEC(@sqltext); DECLARE @bcp_cmd NVARCHAR(4000); SET @bcp_cmd='BCP "SELECT*FROM ##tt" QUERYOUT "c:\temp\tt'+CAST(@i AS NVARCHAR)+'.txt" -c -t, -T -d ' + DB_NAME() + ' -S '+ @@SERVERNAME; EXEC xp_cmdshell @bcp_cmd; DROP TABLE ##tt; SET @i=@i+1; END 

Wenn es nicht möglich ist, die Abfragen in den .sql fileen zu .sql , da es sich um komplexe Skripts handelt, wird das Dienstprogramm sqlcmd viel einfacher zu bedienen. Sie können eine Eingabedatei (Ihr SQL-Skript) mit -i und einer Ausgabedatei (die CSV-fileen) mit -o angeben. -s für die Spalten Trennzeichen und so weiter.

Wenn jemand anderes schaut, um ähnlich zu tun, ist mein Arbeitscode wie folgt:

  DECLARE @Table table( [FileName] varchar(100), depth int, isFile int ) DECLARE @Result int DECLARE @FilePath VARCHAR(100) DECLARE @FileName VARCHAR(100) DECLARE @Fullpath VARCHAR(200) DECLARE @exportFile VARCHAR(100) DECLARE @ExportPath VARCHAR(100) DECLARE @FullExportPath AS VARCHAR(200) DECLARE @Cmd nvarchar(1000) SET @FilePath = '\\192.168.7.111\c$\temp' SET @ExportPath = '\\192.168.7.111\c$\temp\output' INSERT INTO @Table EXEC master..xp_dirtree @FilePath,1,1 DELETE FROM @Table WHERE isFile=0 DECLARE FileList CURSOR STATIC FOR SELECT [FileName] FROM @Table WHERE FileName LIKE '%.sql' OPEN FileList FETCH FIRST FROM FileList INTO @FileName WHILE @@Fetch_Status = 0 BEGIN SET @exportFile = REPLACE(@FileName,'.sql','.csv') SET @FullExportPath = @ExportPath + '\' + @exportFile SET @Fullpath = @FilePath + '\' + @FileName SET @cmd = 'sqlcmd -i "' + @Fullpath + '" -o "' + @FullExportPath + '" -h-1 -s"," -W' EXEC @Result = master..xp_cmdshell @cmd FETCH NEXT FROM FileList INTO @FileName END CLOSE FileList DEALLOCATE FileList