gpt4 book ai didi

SQL Server 无效的列名

转载 作者:行者123 更新时间:2023-12-04 21:58:36 26 4
gpt4 key购买 nike

如果我尝试执行以下代码,则会出现错误

Msg 207, Level 16, State 1, Line 3 Invalid column name 'Another'. Msg 207, Level 16, State 1, Line 4 Invalid column name 'Another'.



即使两者的谓词 IF语句总是评估为假。
CREATE TABLE #Foo (Bar INT)
GO
IF (1=0)
BEGIN
SELECT Another FROM #Foo
END
GO
IF (1=0)
BEGIN
ALTER TABLE #Foo ADD Another INT
SELECT Another FROM #Foo
END
GO
DROP TABLE #Foo

就示例而言,这可能过于简化了;实际上,我需要做的是从列中选择值,但前提是该列存在。如果它不存在,我不在乎。在驱使我提出这个问题的问题中,我的谓词与 EXISTS (SELECT * FROM sys.columns WHERE object_id = @ID AND name = @Name) 一致。 .有没有办法在不求助于我的主要敌人动态 SQL 的情况下实现这一目标?我知道我的 SQL 必须始终格式良好(即符合语法)——即使在一个从未执行过的块中——但我很惊讶我也被迫使其语义正确!

编辑:
虽然我不确定下面的代码对上面的代码有什么帮助,但它是问题的另一个例子。在这种情况下,如果Maybe 存在,我只想使用来自Maybe(可能作为列存在)的值来设置Definite(肯定作为列存在)的值。
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.TableName', 'U') AND name = 'Maybe')
BEGIN
UPDATE dbo.TableName SET Definitely = Maybe
END

最佳答案

SQL Server 不会逐行执行。它不像 .net 或 Java 代码那样是程序化的。所以没有“非执行块”

批量编译一次。此时,该列不存在,但它知道该表将存在。表没有名为“另一个”的列。失败。

正如预期的那样。

现在,您要解决的真正问题是什么?

一些选项:

  • 2 个表或一个同时包含两列的表
  • 使用存储过程解耦作用域
  • 不使用临时表(可能不需要;这可能是您的程序性思维...)
  • 动态 SQL(来自 Mitch 删除的答案)

  • 编辑,评论后;

    为什么不将模式更改隐藏在 View 后面,而不是更改所有代码以处理可能/可能不存在的列?

    关于SQL Server 无效的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925993/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com