SQL Server使用sp_executesql在存儲過程當中執行多個批處理

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存儲過程,還能夠查看下面兩個連接的文章:

使用exec和sp_executesql動態執行SQL語句

sp_executesql (Transact-SQL)

相關文章
相關標籤/搜索