我刚刚遇到了一个好奇的SQL Server行为。
在我的场景中,我有一种动态数据库,因此在运行涉及它们的查询之前,我需要检查是否存在表格和列。
我无法解释查询的原因
IF 0 = 1 -- Check if NotExistingTable exists in my database
BEGIN
SELECT NotExistingColumn FROM NotExistingTable
END
GO
正确执行,但查询
IF 0 = 1 -- Check if NotExistingColumn exists in my ExistingTable
BEGIN
SELECT NotExistingColumn FROM ExistingTable
END
GO
返回无效的列名称' NotExistingColumn' 。
在这两种情况下, IF 块都不会被执行并且包含无效的查询(第一个错过了一个表,第二个错过了一个列)。
有没有理由说SQL引擎只在一种情况下检查语法错误?
提前致谢
答案 0 :(得分:5)
延迟名称解析只能在引用不存在的表对象时使用。创建存储过程时,所有其他对象必须存在。例如,当您引用存储过程中的现有表时,无法列出该表的不存在的列。
答案 1 :(得分:0)
您可以在系统表中查看是否存在特定的表/列名称
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%colname%'
AND t.name LIKE '%tablename%'
ORDER BY schema_name, table_name;
上面的查询将使用列名和表名的部分匹配来拉回所有表/列,只需更改类似的%即可完全匹配。