Ошибка хранимой процедуры SQL Server: «Сообщение об ошибке: необходимо объявить скалярную переменную», ссылаясь на переменную с помощью sp_executesql, но не без - PullRequest
0 голосов
/ 10 октября 2019

Когда я хочу добавить столбец datetime во всю таблицу, я могу написать хранимую процедуру, которая принимает дату в качестве входных данных, а затем сохраняет ее в таблице - например, так:

ALTER PROCEDURE [dbo].[set_datettime]
     (@importDate VARCHAR(100))
AS
BEGIN
    UPDATE [dbo].[table1] 
    SET uploadDate = @importDate
END

Но когда я хочусделать таблицу динамической мне нужно использовать sp_executesql. Поэтому я думаю, что я могу сделать это:

ALTER PROCEDURE [dbo].[set_datettime]
     (@tableName VARCHAR(100), @importDate VARCHAR(100))
AS
BEGIN
    DECLARE @Sql NVARCHAR(MAX);
    SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = @importDate';

    EXECUTE sp_executesql @Sql
END

, но теперь я получаю сообщение об ошибке:

Сообщение об ошибке: необходимо объявить скалярную переменную @ importDate

Несмотря на четкое объявление переменной. Даже если я пытаюсь явно объявить переменную снова, я получаю ошибку, что не могу объявить дубликаты переменных.

Другая вещь, которую я пытался сделать, была:

SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = ' + @importDate;

Но это выдает ошибку

Неверное имя столбца 10-10-2019

Наконец я смог выполнить задачу (в некоторой степени), изменив значение на

    SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = GETDATE()';

НоВ этом решении я определяю дату в хранимой процедуре и не принимаю ее в качестве входных данных, что не является идеальным.

Как получить динамическое определение таблицы, при этом сохраняя динамическую переменную ввода даты?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вам нужно параметризировать ваше динамическое утверждение. Я сейчас печатаю на своем телефоне, поэтому я прошу прощения за любые опечатки:

EXEC sp_executesql @SQL, N'@importdate date', @importdate;

Никогда не вводите параметры в свои динамические операторы. Это создает огромные недостатки безопасности в вашем SQL, называемом SQL-инъекцией.

Редактировать: сейчас не на моем телефоне, поэтому можно выписать полный SP:

ALTER PROCEDURE [dbo].[set_datettime]
     (@tableName sysname, @importDate date)
AS
BEGIN
    DECLARE @Sql NVARCHAR(MAX);
    SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = @importDate;';

    EXECUTE sp_executesql @Sql, N'@importDate date', @importDate;
END;
0 голосов
/ 10 октября 2019

Сначала проверьте:

declare @tableName varchar(100) = 'sometable'
, @importDate varchar(100) = '10-10-2019'

DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = ' + @importDate

select @Sql

Это дает вам неверное утверждение:

UPDATE dbo.[sometable] SET uploadDate = 10-10-2019

Попробуйте:

SET @Sql = 'UPDATE dbo.' + quotename(@tableName) + ' SET uploadDate = ' + '''' + @importDate + ''''

Что дает вам

UPDATE dbo.[sometable] SET uploadDate = '10-10-2019'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...