Sql-Server

多命令 SQLCMD 模式腳本

  • December 8, 2015

我正在嘗試為 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

兩個文件都已創建,但只有最後一個文件獲取所有內容。

任何提示我可以如何更改它以便在每個命令的一個文件中獲取結果?

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;

PS 與此問題無關,您不應在儲存過程名稱前加上sp_它,因為它是為 SQL Server 特殊用途而保留的,並master首先搜尋數據庫,這可能會導致性能問題。

引用自:https://dba.stackexchange.com/questions/123118