【问题标题】:Getting Invalid column name error when using a CTE?使用 CTE 时出现无效的列名错误?
【发布时间】:2021-07-18 16:41:55
【问题描述】:

我有这个查询来更新临时表中的列。

WITH CTE AS
(
    SELECT
        [dbo].[udf_Text](A.column1) AS [NewColumn1], 
        column1 AS [OldDesc],
        ID_1, ID_2
    FROM
        [staging].[Table] A
) 
UPDATE [staging].[Table]
SET [staging].[Table].column1 = CTE.[NewColumn1]
WHERE [staging].[Table].ID_1 = CTE.ID_1 AND ID_2 = CTE.ID_2

我要做的是提取 CTE 中的旧列,然后使用应用了 UDF 的新列对其进行更新。所以我写了这个查询,我得到了这个错误。

消息 207,第 16 层,状态 1,第 45 行
列名“NewColumn1”无效

我怎样才能做到这一点,或者如果有更好的方法来解决这个问题?

【问题讨论】:

  • 我认为您可能缺少 from 子句
  • 您认为CTE_AR 引用的具体内容是什么?您的 CTE 名为 CTE!
  • @Sam332 以下任一答案是否解决了您的问题?如果是这样,请考虑接受一个。

标签: sql sql-server tsql common-table-expression


【解决方案1】:

您实际上需要在UPDATE 声明中引用 CTE:

WITH CTE AS
(
    ....
) 
UPDATE t
SET column1 = CTE.[NewColumn1]
FROM [staging].[Table] t
INNER JOIN CTE ON t.ID_1 = CTE.ID_1 AND t.ID_2 = CTE.ID_2

【讨论】:

    【解决方案2】:

    尽管正如其他人所提到的,您需要加入 CTE 才能引用它,但在此特定示例中您实际上可以直接更新 CTE

    这假设 ID_1ID_2 唯一标识一行

    WITH CTE AS
    (
        SELECT
            [dbo].[udf_Text](A.column1) AS [NewColumn1], 
            column1 AS [OldDesc],
            ID_1, ID_2
        FROM
            [staging].[Table] A
    ) 
    UPDATE CTE
    SET column1 = CTE_AR.[NewColumn1]
    

    CTE 需要遵循updatable views 的规则

    【讨论】:

    • 上面的查询给了我这个错误 Msg 4104, Level 16, State 1, Line 36 无法绑定多部分标识符“[staging].[Table].column1”。出于某种原因,这听起来更容易完成,但 SQL 不喜欢我为此编写的任何查询的结构。
    • 哎呀抱歉现在修复了
    【解决方案3】:

    为什么不直接写逻辑呢?

    UPDATE [staging].[Table]
        SET [staging].[Table].column1 = [dbo].[udf_Text](A.column1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多