我刚刚遇到了一种奇怪的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引擎是否有理由检查语法erorrs?
提前感谢
发布于 2015-03-30 14:09:57
延迟名称解析只能在引用不存在的表对象时使用。所有其他对象都必须在创建存储过程时存在。例如,当在存储过程中引用现有表时,无法列出该表的不存在列。
发布于 2015-03-30 14:23:24
您可以查看系统表中是否存在特定的表/列名。
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; 上面的查询将提取列名和tablename部分匹配的所有表/列,只需将类似的%更改为完全匹配即可。
https://stackoverflow.com/questions/29347947
复制相似问题