创建MS SQL存储过程时出错

时间:2018-07-13 09:49:38

标签: sql-server

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 
)

错误是:

  

消息156,级别15,状态1,第1行关键字附近的语法不正确   “或”。

当我删除“ OR REPLACE”时,错误是

  

消息156,级别15,状态1,过程UPDATE_REFS_P,第3行[批处理   起始行0]关键字'in'附近的语法不正确。

2 个答案:

答案 0 :(得分:0)

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

OR

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

答案 1 :(得分:0)

说明:

您的语句语法适用于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