2012-06-13 56 views
1

我有精美的作品查詢:混淆引號和雙引號中查詢

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

,但我需要在那裏補充一點:

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

到目前爲止,我有:

alter Procedure BCP_Text_File 
    ( 
     @table varchar(100), 
     @FileName varchar(100) 
    ) 
    AS 
     If exists(Select * from information_Schema.tables where [email protected]) 
     Begin 
      Declare @str varchar(1000) 
      set @str='Exec Master..xp_Cmdshell ''bcp " 

      select column_name 
      from information_schema.columns 
      where table_name = '+db_name()+'..'[email protected]+' 
      order by ordinal_position 

      Select * from '+db_name()+'..'[email protected]+'" queryout "'[email protected]+'" -c''' 
      Exec(@str) 
     end 
     else 
      Select 'The table '[email protected]+' does not exist in the database' 

但我想我錯過了單引號和/或雙引號。我將添加此選擇語句,以便我的結果將字段名稱作爲第一行。

非常感謝您的幫助或指導。

+3

調試101:將'EXEC(@str)'更改爲'PRINT(@str)' –

+0

這些「'..」實際上是在查詢中嗎? –

+0

@AaronBertrand對不起,我無法改變它。我不能編譯它 –

回答

3

也許這就是你想要的?這假設(a)列名中沒有逗號,並且(b)每列的輸出在隱式轉換爲字符串時都可以。

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 '[email protected]+' does not exist in the database'; 
    END 
END 
GO 

但我必須同意你從其他人那裏得到的關於這個和其他問題的建議 - 這種方法非常脆弱。你正試圖用壓路機打開開心果。

PS我刪除了引用INFORMATION_SCHEMA,因爲我認爲the catalog views are more reliable and more consistent

+0

非常感謝你是一個寶藏,但是得到這個錯誤:未提供用戶名,使用-U提供用戶名或使用-T進行可信連接 –

+0

建議您獲取基本的BCP命令第一。正如錯誤消息所示,如果您沒有使用默認實例和能夠啓動bcp並重新登錄的帳戶連接到服務器,則需要添加參數,例如-U/-P或 - T. –

+0

我通過把-T放在那裏非常感謝;然而,我看着文件,它沒有放任何逗號,只是空格作爲分隔符 –