2012-05-12 4 views
3

Existe-t-il un moyen de spécifier le format de fichier de sortie en mode SQLCMD afin que je puisse le lire en utilisant BULK INSERT? Je veux faire quelque chose comme ceci:Formatage de la sortie en mode 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 

Répondre

1

Voici un bon exemple pour l'utilisation sqlcmd pour générer un fichier 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 

Vous pouvez utiliser SQLCMD /? pour afficher tous les paramètres applicables. Le paramètre -h -1 indique à l'utilitaire de ne pas sortir le résultat . Paramètre -s "," indique à l'utilitaire d'utiliser une virgule comme séparateur de colonne .

+0

Merci. Cependant, je voulais dire le mode SQLCMD et l'utilitaire sqlcmd. Je le fais à l'intérieur de l'interface SSMS. D'autres suggestions? – Legend

+0

obtient vraiment vissé bu lorsque le texte dans les colonnes a des virgules, mais sinon c'est la réponse dont j'avais besoin – rob

0

Une façon d'obtenir un encombrement de données d'une manière quelque peu automatisée consiste à utiliser une table intermédiaire.

(en utilisant votre scénario d'origine)

: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