使用SQLCMD获取多个结果集

时间:2017-01-13 19:11:52

标签: sql-server tsql sqlcmd

如何使用SQLCMD编写:

  • 多个结果集到一个输出文件?
  • 或多个结果集来分隔输出文件?

讨论

在SSMS中进行原型设计之后,然后转移到从批处理文件调用的SQLCMD,必须保持在同一个连接中(由于在此过程中构建了一些#temp表)。然后,批处理文件将提供给生产操作,生产操作将运行它们并将输出返回给我进行进一步处理。

CREATE TABLE #BatchFileType ( ... )
INSERT INTO #BatchFileType ( ... )
SELECT (...) FROM ...
CREATE NONCLUSTERED INDEX ...

CREATE TABLE #BrandingServiceDates ( ... )
INSERT INTO #BrandingServiceDates (
SELECT (...) FROM #BatchFileType JOIN (other tables)
CREATE NONCLUSTERED INDEX ...

SELECT [result set 1]
SELECT [result set 2]
SELECT [result set n]
...

然后,基于#BrandingServiceDates,创建我们要写入输出文件的多个结果集。每次运行都基于日期范围。这里的目标是不必为每个结果集重做#temp表处理时间。

这是一次性运行,所以希望通过sqlcmd,批处理文件和参数来解决这个问题。

sqlcmd -S %1 -i %2 -W -o %3 -k -s,

其中-o(据我所知)并没有采用一系列文件名。

也欢迎SQLCMD的替代方案。

1 个答案:

答案 0 :(得分:1)

之前我已经使用xp_cmdshell和sqlcmd创建了分隔文件。此示例使用可信连接返回到进行调用的服务器。如果有任何错误,请检查写入@output的结果。或者可能将错误写入TXT文件。

-- xp_cmdshell has a 8000 charater limit
declare @cmd varchar(8000)

-- create a global ##temp table

-- command string to output the table to a couple of different files
set @cmd = 'sqlcmd -E -S "[server]" -d "[database]" -Q"SET NOCOUNT ON select * from ##temp" -s"[delimiter]" -W -h-1 > "d:\file1.txt"'
         + ' & sqlcmd -E -S "[server]" -d "[database]" -Q"SET NOCOUNT ON select * from ##temp" -s"[delimiter]" -W -h-1 > "d:\file2.txt"'

-- replace dynamic values in the command string
set @cmd = replace(@cmd, '[server]', @server)
set @cmd = replace(@cmd, '[database]', @database)
set @cmd = replace(@cmd, '[delimiter]', @delimit)

-- execute the command and output results to a table variable
declare @output table (output varchar(max) null)
insert @output exec master..xp_cmdshell @cmd