在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的替代方案。
答案 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