2012-05-12 1 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