SQL Server中有些SQL語句只能在一個批處理裏面完成,例如CREATE SCHEMA語句建立SCHEMA的時候,每一個SCHEMA都須要在一個單獨的批處理裏面完成:html
CREATE SCHEMA [raw]; GO CREATE SCHEMA [src]; GO CREATE SCHEMA [app]; GO
因此上面語句中,咱們就要在每一個CREATE SCHEMA語句後面加上GO關鍵字,使得每一個CREATE SCHEMA語句在單獨的批處理中執行,這樣三個CREATE SCHEMA語句纔不會報錯。sql
可是若是咱們想把這三個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會報語法錯誤,錯誤提示以下:app
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關鍵字的。spa
那麼怎麼才能在SQL Server的存儲過程當中,執行多個批處理才能執行的語句呢?code
這時候咱們能夠用到sp_executesql存儲過程,sp_executesql這個存儲過程我相信熟悉SQL Server的開發人員都不會陌生,它能夠用來執行由字符串拼接而成的SQL語句。而sp_executesql存儲過程執行SQL語句的時候,還有個特色,那就是sp_executesql存儲過程會將字符串拼接而成的SQL語句在一個單獨的批處理中執行。htm
因此本例中若是咱們要在一個存儲過程當中執行三個CREATE SCHEMA語句,能夠經過調用三次sp_executesql存儲過程來實現,咱們將上面dbo.SP_CreateSchemas存儲過程的代碼改成以下:blog
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存儲過程,還能夠查看下面兩個連接的文章: