SQL Server中有些SQL語句只能在一個批處理里面完成,例如CREATE SCHEMA語句創建SCHEMA的時候,每個SCHEMA都需要在一個單獨的批處理里面完成:
CREATE SCHEMA [raw]; GO CREATE SCHEMA [src]; GO CREATE SCHEMA [app]; GO
所以上面語句中,我們就要在每個CREATE SCHEMA語句后面加上GO關鍵字,使得每個CREATE SCHEMA語句在單獨的批處理中執行,這樣三個CREATE SCHEMA語句才不會報錯。
但是如果我們想把這三個CREATE SCHEMA語句直接封裝在一個存儲過程中,又不行了,因為存儲過程中是不能夠有GO語句的,例如如果我們創建個存儲過程dbo.SP_CreateSchemas,將三個CREATE SCHEMA語句直接放進去,如下所示:
CREATE PROCEDURE dbo.SP_CreateSchemas AS BEGIN CREATE SCHEMA [raw]; GO CREATE SCHEMA [src]; GO CREATE SCHEMA [app]; GO END GO
執行上面的創建存儲過程時,SQL Server會報語法錯誤,錯誤提示如下:
Msg 156, Level 15, State 1, Procedure SP_CreateSchemas, Line 5 [Batch Start Line 0]
Incorrect syntax near the keyword 'SCHEMA'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near 'END'.
原因就是在存儲過程中,是不能有GO關鍵字的。
那么怎么才能在SQL Server的存儲過程中,執行多個批處理才能執行的語句呢?
這時候我們可以用到sp_executesql存儲過程,sp_executesql這個存儲過程我相信熟悉SQL Server的開發人員都不會陌生,它可以用來執行由字符串拼接而成的SQL語句。而sp_executesql存儲過程執行SQL語句的時候,還有個特點,那就是sp_executesql存儲過程會將字符串拼接而成的SQL語句在一個單獨的批處理中執行。
所以本例中如果我們要在一個存儲過程中執行三個CREATE SCHEMA語句,可以通過調用三次sp_executesql存儲過程來實現,我們將上面dbo.SP_CreateSchemas存儲過程的代碼改為如下:
CREATE PROCEDURE [dbo].[SP_CreateSchemas] AS BEGIN DECLARE @sql NVARCHAR(MAX); SET @sql=N' CREATE SCHEMA [raw]; ' EXEC sp_executesql @sql; SET @sql=N' CREATE SCHEMA [src]; ' EXEC sp_executesql @sql; SET @sql=N' CREATE SCHEMA [app]; ' EXEC sp_executesql @sql; END GO
由於SQL Server的存儲過程中是可以多次調用其它存儲過程的,所以我們在dbo.SP_CreateSchemas存儲過程中,通過調用三次sp_executesql存儲過程,每次執行一個CREATE SCHEMA語句,這樣相當於就是使用了三個批處理分別執行了三個CREATE SCHEMA語句。這里順便說一下,sp_executesql存儲過程執行字符串SQL語句時,也不能在字符串SQL語句中使用GO關鍵字,只能夠通過多次調用sp_executesql存儲過程來代替GO關鍵字。
執行dbo.SP_CreateSchemas存儲過程,現在三個SCHEMA就在數據庫中成功創建好了:
EXEC [dbo].[SP_CreateSchemas]
如下所示:
關於sp_executesql存儲過程,還可以查看下面兩個鏈接的文章: