SQL Server模糊查询验证

时间:2015-03-30 13:49:37

标签: sql-server

我刚刚遇到了一个好奇的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引擎只在一种情况下检查语法错误?

提前致谢

2 个答案:

答案 0 :(得分:5)

Deffered name resolution

  

延迟名称解析只能在引用不存在的表对象时使用。创建存储过程时,所有其他对象必须存在。例如,当您引用存储过程中的现有表时,无法列出该表的不存在的列

答案 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; 

上面的查询将使用列名和表名的部分匹配来拉回所有表/列,只需更改类似的%即可完全匹配。