sql - 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”附近的语法不正确。
有任何想法吗?
解决方案
在您的情况下(我假设)使用动态 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;
推荐阅读
- javascript - 对地图中的数据进行字符串化?
- c++ - 语法“ContextRegistrar_##ContextType”的含义
- performance - Powershell 性能
- mysql - 如何获得总用户平均时间超过 7 天
- python - 如何将 Google Colab 连接到 Cassandra?
- laravel - Laravel @guest 无法识别自定义守卫之一
- r-markdown - 如何像使用 ioslides 一样获得便携式 Xarginan 演示文稿?
- laravel - Laravel 5.6 符号链接问题,404 Not Found,但路径确实存在
- android - java.lang.IllegalStateException:预期的 BEGIN_OBJECT
- java - 具有大量记录的休眠序列生成器