首页 > 解决方案 > SQL Server 中的动态函数问题

问题描述

我有一张桌子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”附近的语法不正确。

有任何想法吗?

标签: sqlsql-serverdynamic-function

解决方案


在您的情况下(我假设)使用动态 SQL 的全部意义在于允许使用动态表名。在这种情况下,您必须将表名插入动态 SQL 字符串 - 您不能将其作为参数传递,这就是您首先要尝试的问题。

此外,您不需要 aSET后跟直接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;

推荐阅读