Проблема с функцией Dynami c в SQL Server - PullRequest
2 голосов
/ 11 марта 2020

У меня есть таблица dbo.t_products, и я хочу знать, последняя обновленная запись. Для этого у меня есть атрибут last_changed, который хранит для каждой записи метку времени последнего обновления.

Наконец, я хочу сохранить этот результат в переменной с именем @y.

DECLARE @y DATETIME
DECLARE @p_table VARCHAR(100)

SET @p_table = 'dbo.t_products'

EXECUTE sp_executesql N'SET @y = SELECT MAX(last_changed) FROM @p_table'
                        ,N'@p_table VARCHAR, @y DATETIME OUTPUT'
                        ,@p_table
                        ,@y OUTPUT
SELECT @y

Система возвращает следующее сообщение:

Сообщение 156, Уровень 15, Состояние 1, Строка 25
Неверный синтаксис рядом с ключевым словом «SELECT».

Есть идеи?

1 Ответ

4 голосов
/ 11 марта 2020

Смысл использования Dynami c SQL в вашем случае (я полагаю) состоит в том, чтобы разрешить использование имени таблицы Dynami c. В этом случае вы должны вставить имя таблицы в строку Dynami c SQL - вы не можете передать его в качестве параметра, это проблема, которую вы пытаетесь в первую очередь.

Также вам не нужно SET, за которым следует SELECT, просто используйте SELECT непосредственно для установки переменной.

Наконец, вы определенно хотите использовать функцию QUOTENAME для экранируйте имя таблицы и избегайте атаки инъекцией SQL - для этого необходимо разделить имя таблицы и имя схемы.

DECLARE @y DATETIME;
DECLARE @p_schema VARCHAR(100);
DECLARE @p_table VARCHAR(100);
DECLARE @SQL NVARCHAR(max);

SET @p_schema = 'dbo';
SET @p_table = 't_products';
-- Add the table name to the dynamic SQL 
SET @SQL = 'SELECT @y = MAX(last_changed) FROM ' + QUOTENAME(@p_schema) + '.' + QUOTENAME(@p_table);

EXECUTE sp_executesql @SQL, N'@y DATETIME OUTPUT', @y OUTPUT;

-- PRINT(@SQL); --- Debugging

SELECT @y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...