Verwirrung mit Zitaten und doppelten Anführungszeichen in einer Abfrage

Ich habe eine Abfrage, die schön funktioniert:

CREATE Procedure BCP_Text_File ( @table varchar(100), @FileName varchar(100) ) AS If exists(Select * from information_Schema.tables where table_name=@table) Begin Declare @str varchar(1000) set @str='Exec Master..xp_Cmdshell ''bcp "Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c''' Exec(@str) end else Select 'The table '+@table+' does not exist in the database' 

aber ich muss das hier hinzufügen:

 select column_name from information_schema.columns where table_name = @table order by ordinal_position 

so weit ich habe:

  alter Procedure BCP_Text_File ( @table varchar(100), @FileName varchar(100) ) AS If exists(Select * from information_Schema.tables where table_name=@table) Begin Declare @str varchar(1000) set @str='Exec Master..xp_Cmdshell ''bcp " select column_name from information_schema.columns where table_name = '+db_name()+'..'+@table+' order by ordinal_position Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c''' Exec(@str) end else Select 'The table '+@table+' does not exist in the database' 

aber ich denke, ich bin die falschen Zitate und / oder doppelte Anführungszeichen falsch. Ich füge diese select-statement hinzu, so dass mein Ergebnis die Feldnamen als erste Zeile hat.

Vielen Dank für jede Hilfe oder Anleitung.

Vielleicht ist das, was du willst Dies setzt voraus, dass (a) keiner Ihrer Spaltennamen Kommas in ihnen hat und (b) die Ausgabe jeder Spalte, wenn sie implizit in einen String umgewandelt wird, in Ordnung ist.

 ALTER PROCEDURE dbo.BCP_Text_File @table NVARCHAR(255), @filename VARCHAR(100) AS BEGIN SET NOCOUNT ON; IF OBJECT_ID(@table) IS NOT NULL BEGIN DECLARE @sql NVARCHAR(MAX), @cols NVARCHAR(MAX) = N''; SELECT @cols += ',' + name FROM sys.columns WHERE [object_id] = OBJECT_ID(@table) ORDER BY column_id; SELECT @cols = STUFF(@cols, 1, 1, ''); SET @sql = N'EXEC master..xp_cmdshell ''bcp "SELECT ''''' + REPLACE(@cols, ',', ''''',''''') + ''''' UNION ALL SELECT ' + 'RTRIM(' + REPLACE(@cols, ',', '),RTRIM(') + ') FROM ' + DB_NAME() + '..' + @table + '" queryout "' + @filename + '" -c'''; EXEC sp_executesql @sql; END ELSE BEGIN SELECT 'The table '+@table+' does not exist in the database'; END END GO 

Aber ich muss mit dem Rat einverstanden sein, den Sie von anderen auf diese und andere Fragen bekommen haben – dieser Ansatz ist sehr spröde. Du versuchst, eine Pistazie mit einer Dampfwalze zu öffnen.

PS habe ich referenceen auf INFORMATION_SCHEMA , weil ich denke, die Katalogansichten sind zuverlässiger und konsequenter .