多命令SQLCMD模式脚本

Mag*_*ier 4 sql-server sql-server-2008-r2 sqlcmd

我正在尝试在 sqlcmd 模式下为表列表执行 sql 过程,以将所有输出重定向到每个表的一个文件中。

不幸的是,只有所有命令的重定向输出的最后一个文件才能获得内容。

例如,我执行以下操作:

:OUT  c:\test\tab0.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab0', @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
:OUT  c:\test\tab1.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab1' , @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
Run Code Online (Sandbox Code Playgroud)

两个文件都被创建,但只有最后一个文件获得所有内容。

任何提示我可以如何更改它以便在每个命令的一个文件中获得结果?

Sol*_*zky 5

GO在两个部分之间放置一个(即批处理分隔符)。SQLCMD 命令和变量按每个批处理进行处理。我对此进行了测试,没有GO(即它在问题中的设置方式),我得到了与您所看到的相同的行为:第一个文件存在但为空,而第二个文件具有两个存储过程执行的结果。这是由于两个:out命令在同一批次中,因此第二个命令:out替换了第一个命令。

但是,如果我GO在它们之间放置一个,则每个输出文件都只有一次执行的结果:

:OUT  c:\test\tab0.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo',
           @table_name ='tab0', @include_timestamp = 0,
           @ommit_images = 1, @CreateProcedure = 1;
GO
:OUT  c:\test\tab1.sql 
 EXEC [dbo].[sp_generate_merge] @schema = 'dbo',
           @table_name ='tab1' , @include_timestamp = 0,
           @ommit_images = 1, @CreateProcedure = 1;
Run Code Online (Sandbox Code Playgroud)

PS 与此问题无关,您不应在存储过程名称前加上前缀,sp_因为它是为 SQL Server 特殊用途保留的,并master首先搜索数据库,这可能会导致性能问题。