在SQLCMD模式下格式化输出?

时间:2012-05-12 07:49:22

标签: sql sql-server sql-server-2008 tsql sqlcmd

有没有办法可以在 SQLCMD模式中指定输出文件格式,以便我可以使用BULK INSERT读取它?我想做这样的事情:

: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

2 个答案:

答案 0 :(得分: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“,”指示实用程序使用逗号作为   列分隔符。

答案 1 :(得分: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