Rai*_*BBS 2 t-sql sql-server stored-procedures common-table-expression sql-server-2012
我是SQL Server 2012的新手,我正在尝试创建一个应该存储的存储过程:
但是我需要使用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上方有任何可执行语句,则始终以分号开头.