在SQL Server 2012中的存储过程中执行多个语句和CTE?

Rai*_*BBS 2 t-sql sql-server stored-procedures common-table-expression sql-server-2012

我是SQL Server 2012的新手,我正在尝试创建一个应该存储的存储过程:

  1. 然后,根据参数从表中删除先前的数据
  2. 在该表上插入新数据.

但是我需要使用CTE来表现性能和其他原因(不要挂断,我必须,只需听取我的意见).

如果CTE查询在存储过程中本身就可以正常工作,但是我不能让SP使用两个子句.

我在尝试创建程序时遇到错误,抱怨我应该在CTE之前使用分号.如果我添加分号,SQL Server也会抱怨它.这让我疯了,请帮忙!

我要删除/插入的表:

CREATE MYTABLE ( APPUSER NVARCHAR(15), DATA NVARCHAR(100) )
Run Code Online (Sandbox Code Playgroud)

简化的存储过程(无分号):

CREATE PROCEDURE P1 ( @SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS
BEGIN
    DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER )

    WITH CTE AS (
        SELECT DATA
        FROM SOURCETABLE
        WHERE ( TYPE = @TYPE )
    )
    INSERT INTO MYTABLE
    SELECT
        @SOMEUSER,
        DATA
    FROM CTE 
END
Run Code Online (Sandbox Code Playgroud)

没有分号的错误消息:

[错误代码:319,SQL状态:S1000]关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

请注意,即使这是实际查询的简化版本,错误也完全相同.我没试过上面的代码,没有任何运气:(

带分号的存储过程(与上面相同的查询,为简洁起见仅显示分号):

(...)
BEGIN
    DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER ); /* Semicolon */

    WITH CTE AS (    
(...)
Run Code Online (Sandbox Code Playgroud)

分号出错:

[错误代码:102,SQL状态:42000]')'附近的语法不正确.

我尝试在它自己的事务中包含DELETE子句,这也不起作用,总是得到两个错误之一.

任何指针都将非常感谢,谢谢!

小智 6

你需要把';' 在'With'关键字之前,您的代码看起来像这样

CREATE PROCEDURE P1 ( @SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS
BEGIN
    DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER )

    ;WITH CTE AS (
        SELECT DATA
        FROM SOURCETABLE
        WHERE ( TYPE = @TYPE )
    )
    INSERT INTO MYTABLE
    SELECT
        @SOMEUSER,
        DATA
    FROM CTE 
END
Run Code Online (Sandbox Code Playgroud)

作为CTE的拇指规则,如果CTE上方有任何可执行语句,则始终以分号开头.

  • 根据经验,你应该用分号结束**每个语句:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start-your-semi- colons.aspx (4认同)