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)

相关文章
相关标签/搜索