【发布时间】:2020-04-04 03:38:56
【问题描述】:
我有一个正在运行的存储过程,它正在变量表 (v) 中查找 ID 名称作为其他数据库表(a、b、c 等)的摘要。由于并非所有表都有名为 ID 的 ID,因此我将它们存储在此变量表中。
这将用于从相应的表中获取最大 ID。
运行以下命令时一切正常,我得到了对应表的最大 ID:
DECLARE @TableMaxID INT
SELECT @TableMaxID = ISNULL(MAX(TableID_a),0)
FROM DB.SCHEMA.Table_a
PRINT @TableMaxID
运行这个查询我正确地得到了最大 ID 表格表 a - '59'
由于我想在此命令中使用变量,我尝试了以下操作
DECLARE @TableMaxID INT
,@TableIdName NVARCHAR (50)
SET @TableIdName = 'TableID_a'
SELECT TableMaxID = ISNULL(MAX(@TableIdName),0)
FROM DB.SCHEMA.Table_a
运行它会导致错误
将 nvarchar 值“TableID_a”转换为数据类型 int 时转换失败。
只有在使用SELECT 命令时,我才明白发生了什么——因为我得到了@TableIdName 变量的名称而不是数值“59”
DECLARE @TableMaxID INT
,@TableIdName NVARCHAR (50)
SET @TableIdName = 'TableID_a'
SELECT ISNULL(MAX(@TableIdName),0)
FROM DB.SCHEMA.Table_a
PRINT @TableMaxID
返回变量名'TableID_a'
我有点困惑。我在这里做错了什么。有没有办法像我尝试那样使用该变量,或者我完全错了。
【问题讨论】:
-
简短的回答是不能在查询中使用变量值作为列名,因为 T-SQL 不会像宏一样扩展它。有必要在代码中构建和执行动态 SQL 语句字符串。也就是说,将列和表作为参数传递表明存在设计缺陷,恕我直言。见this recent question。
标签: sql-server tsql isnull