小编Rai*_*BBS的帖子

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

我是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 ); /* …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server stored-procedures common-table-expression sql-server-2012

2
推荐指数
1
解决办法
3万
查看次数