Смысл использования 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;