Microsoft SQL Server似乎在定义存储过程时检查列名有效性,但不检查表名有效性。如果它检测到当前存在引用的表名,则它会根据该表中的列验证语句中的列名。因此,例如,这将运行正常:
CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
SELECT
Col1, Col2, Col3
FROM
NonExistentTable
END
GO
......就像这样:
CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
SELECT
ExistentCol1, ExistentCol2, ExistentCol3
FROM
ExistentTable
END
GO
...但是由于“列名无效”而失败:
CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
SELECT
NonExistentCol1, NonExistentCol2, NonExistentCol3
FROM
ExistentTable
END
GO
为什么SQL Server检查列而不是表?肯定是不一致的;它应该做两件事,或两者都不做。我们能够定义可能引用模式中不存在的表和/或列的SP是有用的,所以有没有办法关闭SQL Server对列存在的检查 在目前存在的表中?