2012-05-12 90 views
3

有沒有一種方法可以指定輸出文件格式SQLCMD模式這樣我就可以使用BULK INSERT來讀回它?我想要做這樣的事情:在SQLCMD模式下格式化輸出?

:CONNECT SERVER1 
:OUT 'E:\test' 

SELECT TOP 100 ID, NAME 
FROM DB1.dbo.TABLE1 

GO 

:CONNECT SERVER2 
:OUT 'E:\test2' 

CREATE TABLE #TEMP(ID INT, NAME VARCHAR(100)) 

BULK 
INSERT #TEMP 
FROM 'E:\test' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 

SELECT * 
FROM DB2.dbo.TABLE2 
WHERE ID IN (SELECT ID FROM #TEMP) 

-- Other queries for #TEMP 

GO 

回答

1

下面是使用SQLCMD生成CSV文件一個很好的例子:

http://www.siusic.com/wphchen/sqlcmd-example-to-output-in-csv-format-350.html

sqlcmd 
    -S 「ServerName」 -U 「UID」 -P 「PWD」 -d 「DBName」 
    -i 「c:\input.txt」 
    -o 「c:\output.txt」 
    -s 「,」 
    -h -1 

您可以使用SQLCMD /?顯示所有適用的 參數。 ... 參數-h -1指示實用程序不輸出結果 設置標題。參數-s「」指示實用程序使用逗號作爲 列分隔符。

+0

謝謝。但是,我的意思是SQLCMD模式和sqlcmd實用程序。我正在SSMS界面中執行此操作。還有其他建議嗎? – Legend

+0

當列中的文本有逗號時,會變得非常糟糕,但除此之外,這是我需要的答案 – rob

0

以某種自動化方式獲取數據批量的一種方法是使用中間表。

(使用原來的方案)

:CONNECT SERVER1 
    :OUT 'E:\test' 

    SELECT TOP 100 '^'+cast(ID as varchar(16))+'^^'+NAME 
    FROM DB1.dbo.TABLE1 

    GO 

    :CONNECT SERVER2 
    :OUT 'E:\test2' 

    CREATE TABLE #TEMP1(BOTHCOLUMNS VARCHAR(116)) 

    BULK 
    INSERT #TEMP1 
    FROM 'E:\test' 
    GO 

    CREATE TABLE #TEMP2(ID INT, NAME VARCHAR(100)) 

    INSERT #TEMP2 
    SELECT 
     Substring(BOTHCOLUMNS, 2, Patindex('%^^%', BOTHCOLUMNS) - 2), 
     Substring(BOTHCOLUMNS, Patindex('%^^%', BOTHCOLUMNS) + 2, 
       Len(BOTHCOLUMNS) - Patindex('%^^%', BOTHCOLUMNS) - 1) 
    FROM #TEMP1 
    WHERE Patindex('%^^%', BOTHCOLUMNS) > 1 


    SELECT t2.* 
    FROM DB2.dbo.TABLE2 t2 
    JOIN #TEMP2 tmp2 on tmp2.ID=t2.ID 


-- Other queries for #TEMP 

GO