2014-02-13 45 views
0

對於SQL和腳本編程,做了一個搜索,也許使用了不正確的措辭,所以我張貼我的問題。我在MSFT Sql Server的管理工作室腳本生成這些消息的結果:DOS版Echo命令的SQL版本?

(1566行(S)的影響)

(59行(S)的影響)

(1566行(S)的影響)

(1566行(S)的影響)

(262行(S)的影響)

一切正常,但我想添加一個語句,這樣,如果有人以外自己[R在這個腳本中,他們可以告訴發生了什麼,類似於批處理文件中的舊Dos ECHO命令。這樣的結果是這個樣子:

備份表: (受影響的1566行(S))

更新合併目標: (59行(S)的影響)

清理舊錶: (1566行(S)的影響)

出口歷史: (1566行(S)的影響)

刪除空白的記錄: (262行受影響)

我不在乎他們是否坐在同一行或每個受影響的語句上面,我只需要某種標籤輸出。謝謝大家!

+0

http://technet.microsoft.com/en-us/library/ms176047.aspx – OldProgrammer

回答

1

每個你能PRINT語句之間以及命令呼應@@ROWCOUNT

PRINT 'Backup Table: ' + CAST(@@ROWCOUNT AS NVARCHAR) 

對於實例

SET NOCOUNT ON 

SELECT 1 UNION SELECT 2 
PRINT 'Backup Table: (' + CAST(@@ROWCOUNT AS NVARCHAR) + ' row(s) affected)' 

SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
PRINT 'Update Merge Targets: (' + CAST(@@ROWCOUNT AS NVARCHAR) + ' row(s) affected)' 

SET NOCOUNT OFF 

OUPUTS

Backup Table: (2 row(s) affected) 
Update Merge Targets: (3 row(s) affected) 
+0

這是一個很好的。當我走得更遠時,我會保存它。 :-) – user2994079

6

一種替代PRINT是使用RAISERROR()。奇怪的是,鑑於它的名字,這不僅僅是爲了報告錯誤。

RAISERROR('message',10,1)只是報告信息。

您還可以在最後添加WITH NOWAIT;這具有消息立即出現的優點。 PRINT語句會與其他消息和結果集一起緩衝,因此如果在特定的PRINT之後發生長時間運行的任務,則在長時間運行的任務也完成之前,您可能實際上看不到PRINT ed消息。

另外,值得注意的是,RAISERROR()包括一些原始printf樣式格式的功能,而與PRINT你堅持自己組裝的字符串,執行CONVERT調用非字符串值轉換爲字符串。例如: -

RAISERROR (N'This is message %s %d.',10,1,N'number',5) WITH NOWAIT; 

會打印:

This is message number 5 

的消息窗口立即。


作爲一個例子,嘗試運行兩個以下腳本。 1:

print 'abc' 
print 'def' 
waitfor delay '00:00:30' 
print 'ghi' 

和2:

RAISERROR('abc',10,1) WITH NOWAIT 
RAISERROR('def',10,1) WITH NOWAIT 
waitfor delay '00:00:30' 
RAISERROR('ghi',10,1) WITH NOWAIT 

雙方產生相同的輸出:

abc 
def 
ghi 

兩者之間的區別是,腳本1,你會看到任何輸出30秒,然後看到所有3行,而對於腳本2,您將看到:

abc 
def 
0立即顯示

,然後在30秒後顯示最後一行。

+0

好注意!我可能會使用打印,以幫助我瞭解我的腳本的時間。 – user2994079

+0

@ user2994079 - 我不確定你的意思是按時間表。正如我在我的回答中所指出的,「print」被緩衝,而「RAISERROR ... WITH NOWAIT」是立即的。所以如果你需要知道*什麼時候發生,那麼'PRINT'是更糟的選擇。 –