Хранимая процедура SQL Server для обновления таблицы в SQL Server 2012 с ошибкой синтаксиса - PullRequest
1 голос
/ 31 мая 2019

У меня есть хранимая процедура ниже, и я получаю это сообщение об ошибке:

Неверный синтаксис рядом с '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

Наконец, полученная ошибка msg:

Msg 102, Level15, состояние 1, строка 1
Неверный синтаксис рядом с '01'

Обновление: добавление скобки вокруг имени таблицы исправило «неправильную синтаксическую ошибку», хотя теперь я получаю ошибку

Ошибка преобразования типа данных nvarchar в int

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Ваш хранимый процесс 01_cms_new_mgr_bull_appr_update явно не возвращает значение, поэтому он, вероятно, возвращает либо 0, либо -1, что указывает на то, что процесс завершен или по какой-то причине не выполнен.

Тогда ваше заявление:

SELECT  'Return Value' = @return_value
GO

Не будет возвращать столбец с именем [Возвращаемое значение] со значением @return_value. Вероятно, он попытался бы присвоить @return_value (int) константной строке символов «Возвращаемое значение». Вы можете попробовать:

SELECT @return_value AS return_value
GO

OR

SELECT 'Return Value = ' + @return_value AS return_string
GO 
0 голосов
/ 04 июня 2019

Решение оказалось в последней строке моего кода, с добавлением '@', добавляющего последние 2 переменные.

Я разместил решение ниже:

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
0 голосов
/ 31 мая 2019

Как прокомментировано, избегайте любой динамической сборки запроса, так как нет необходимости динамически изменять структурный компонент, такой как таблицы или столбцы. Параметры могут использоваться непосредственно в объявленных операторах 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
...