【问题标题】:Error in creating MS SQL stored procedure创建 MS SQL 存储过程时出错
【发布时间】:2018-12-21 16:08:45
【问题描述】:
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”时,错误是

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

【问题讨论】:

  • 那不是 T-SQL——SQL Server 使用的 SQL 方言,它完全来自不同的数据库。你需要重写它。
  • SQL Server 的语法是CREATE OR ALTER,但是,就像@AlexK。已经指出,剩下的仍然不是SQL Server。 SQL Server 使用方括号 ([]) 引用对象,而不是双引号 ("),并且变量/参数以 at 符号 (@) 开头,并且不是带有 in 的声明。我不知道那是什么语言。
  • 那是甲骨文..
  • @That was Oracle.@ Msg 156 this ms sql error message
  • 虽然这部分过程定义很容易通过一些调整来重写,但当涉及到存储过程中的大多数(命令式、过程式)语句时,Oracle 和 SQL Server 是非常不同的。如果这不是编写新程序的练习,而是尝试移植现有程序,那么您可能需要精通这两种数据库系统的人。

标签: sql-server


【解决方案1】:
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

【讨论】:

  • 你想说什么??
  • Сorrect 语法!!
  • 在 SQL Server 2016 SP1 及更高版本中,可以使用CREATE OR ALTER
  • in pIdProcessExec bigint, 是什么意思?这不是 SQL Server 语法。
【解决方案2】:

说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2016-11-28
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多