SQL Server存储过程,用于使用不正确的语法错误更新SQL Server 2012中的表

时间:2019-05-31 16:45:12

标签: sql stored-procedures sql-server-2012 ssms

我具有以下存储过程,并且收到此错误消息:

  

“ 01”附近的语法不正确

我还有其他以“ 01”开头的存储过程,它们工作正常。我不确定错误的语法在哪里。

感谢任何潜在客户。

这是我的表结构:

CREATE TABLE [dbo].[01_news_test]   
(
     [interestid] [INT] IDENTITY(1, 1) NOT FOR REPLICATION NOT NULL,
     [username]   [VARCHAR](50) NULL,
     [approval]   [BIT] NULL,

     CONSTRAINT [PK_news_test] 
         PRIMARY KEY CLUSTERED ([interestid] DESC)
                     WITH (pad_index = OFF, statistics_norecompute = OFF, 
                           ignore_dup_key = OFF, allow_row_locks = on, 
                           allow_page_locks = on, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

这是存储过程的代码(如下):

ALTER PROCEDURE [dbo].[01_cms_news_mgr_bull_appr_update]
    @InterestID INT,
    @Approval BIT
AS
    DECLARE @sql NVARCHAR(4000)

    SELECT @sql = ' UPDATE [01_news_test] ' +
              ' SET ' +
              ' Approval = @Approval ' +
              ' WHERE ' 

    IF @InterestID IS NOT NULL 
        SELECT @sql = @sql + ' InterestID = @InterestID'

    SELECT @sql = @sql + '; '

    EXEC sp_executesql @sql, N'@InterestID INT, @Approval BIT', InterestID, Approval    

并且,这是在SQL Server Management Studio中执行存储过程时的代码:

DECLARE @return_value INT

EXEC    @return_value = [dbo].[01_cms_news_mgr_bull_appr_update]
               @InterestID = 1,         
               @Approval = 0

SELECT  'Return Value' = @return_value
GO

最后,产生的错误消息:

  

第15级状态1行1的消息102
  '01'附近的语法不正确

更新:尽管我现在遇到了错误,但在表名周围添加了一个括号,以解决“语法错误”的错误

  

将数据类型nvarchar转换为int时出错

3 个答案:

答案 0 :(得分:0)

如前所述,避免任何动态的查询构建,因为不需要动态修改表或列之类的结构组件。参数可以直接在声明的SQL语句中使用。

ALTER PROCEDURE [dbo].[01_cms_news_mgr_bull_appr_update]
    @InterestID INT,
    @Approval BIT
AS

BEGIN
    UPDATE [01_news_test] 
    SET Approval = @Approval
    WHERE InterestID = @InterestID
END

答案 1 :(得分:0)

您存储的01_cms_new_mgr_bull_appr_update proc没有显式返回值,因此,它可能返回0或-1,表明proc由于某种原因完成或失败。

然后,您的声明:

SELECT  'Return Value' = @return_value
GO

将不会返回名称为[Return Value]且值为@return_value的列。可能会尝试将@return_value(int)分配给const char字符串“ Return Value”。您可以尝试:

SELECT @return_value AS return_value
GO

OR

SELECT 'Return Value = ' + @return_value AS return_string
GO 

答案 2 :(得分:0)

该解决方案最终出现在我的代码的最后一行,最后两个变量前面加上了“ @”。

我在下面发布了解决方案:

ALTER PROCEDURE [dbo].[01_cms_news_mgr_bull_appr_update]
    @InterestID INT,
    @Approval BIT AS
    DECLARE @sql NVARCHAR(4000)

    SELECT @sql = ' UPDATE [01_news_test] ' +
              ' SET ' +
              ' Approval = @Approval ' +
              ' WHERE ' 

    IF @InterestID IS NOT NULL 
        SELECT @sql = @sql + ' InterestID = @InterestID'

    SELECT @sql = @sql + '; '

    EXEC sp_executesql @sql, N'@InterestID INT, @Approval BIT', @InterestID, @Approval