创建MS SQL存储过程时出错


CREATE OR REPLACE PROCEDURE "SECURITY"."UPDATE_REFS_P" 
( 
in pIdProcessExec bigint, 
in pProcessDate DATE, 
in pDebugMode integer default 0, 
in pCallingInterface varchar(200) default 'Manual', 
out pCheckResult integer 
)

错误为:

Msg 156,Level 15,State 1,Line 1关键字附近的语法不正确'或'。

当我删除"OR REPLACE"时,错误为

Msg 156,Level 15,State 1,Procedure UPDATE_REFS_p,Line 3[批次起始行0]关键字"in"附近的语法不正确。

CREATE PROCEDURE "SECURITY"."UPDATE_REFS_P" 
@pIdProcessExec bigint, 
@pProcessDate DATE, 
@pDebugMode integer default 0, 
@pCallingInterface varchar(200) default 'Manual', 
@pCheckResult integer OUT

ALTER PROCEDURE "SECURITY"."UPDATE_REFS_P" 
@pIdProcessExec bigint, 
@pProcessDate DATE, 
@pDebugMode integer default 0, 
@pCallingInterface varchar(200) default 'Manual', 
@pCheckResult integer OUT

另一种变体

IF OBJECT_ID(SECURITY.UPDATE_REFS_P) IS NOT NULL
DROP PROC SECURITY.UPDATE_REFS_P
GO
CREATE PROCEDURE "SECURITY"."UPDATE_REFS_P" 
@pIdProcessExec bigint, 
@pProcessDate DATE, 
@pDebugMode integer default 0, 
@pCallingInterface varchar(200) default 'Manual', 
@pCheckResult integer OUT

解释:

您的语句语法适用于PL/SQL(Oracle(。错误消息来自MS SQL Server。如果您想将此语句转换为T-SQL(MS SQL Server(,则必须使用以下内容(SECURITY必须是您的架构名称或使用dbo作为架构名称(:

CREATE PROCEDURE [SECURITY].[UPDATE_REFS_P]
@pIdProcessExec bigint, 
@pProcessDate date, 
@pDebugMode integer = 0, 
@pCallingInterface varchar(200) = 'Manual',
@pCheckResult integer OUTPUT
AS
BEGIN
...
END 

ALTER PROCEDURE [SECURITY].[UPDATE_REFS_P]
@pIdProcessExec bigint, 
@pProcessDate date, 
@pDebugMode integer = 0, 
@pCallingInterface varchar(200) = 'Manual',
@pCheckResult integer OUTPUT
AS
BEGIN
...
END

扩展语法OR ALTER适用于Azure SQL数据库和SQL Server(从SQL Server 2016(13.x(SP1开始(。

工作示例:

CREATE PROCEDURE [dbo].[UPDATE_REFS_P]
@pIdProcessExec bigint, 
@pProcessDate date, 
@pDebugMode integer = 0, 
@pCallingInterface varchar(200) = 'Manual',
@pCheckResult integer OUTPUT
AS
BEGIN
-- Default value as resultset
SELECT @pCallingInterface AS [TEXT]
-- Output parameter value
SELECT @pCheckResult = 123
--
RETURN 0
END

最新更新