首页 > 解决方案 > SQL Server 通过“WITH”语句更新并加入

问题描述

我希望能够一次更新一个表,而不是多个语句,我不想​​制作一个临时表。

为了测试这一点,我制作了这张表:

USE [SomeSchema]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [SomeSchema].[TestTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [TextField] [varchar](250) NULL,
    [updateField] [varchar](20) NULL,
 CONSTRAINT [Pk_TestTable_Id] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [Idx_TestTable] UNIQUE NONCLUSTERED 
(
    [TextField] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

我试图将这两个答案(https://stackoverflow.com/a/57965771https://stackoverflow.com/a/32431922/369122)组合成一个工作声明。

我的最后一次尝试:

WITH NewData AS 
(
    SELECT * FROM ( VALUES  ('abc', 'A'),('def','d'),('ghi','g')) 
    x 
    (TextField, updateField)
)
update [SomeSchema].[TestTable]
set _a.updateField= _b.updateField
from 
[SomeSchema].[TestTable] _a,
NewData _b 
where _a.TextField=_b.TextField

出现此错误:Msg 4104, Level 16, State 1, Line 22 无法绑定多部分标识符“_a.updateField”。

有什么建议么?作为记录; 这只是一个测试。在实践中,我需要能够连接多个列来更新一个或多个列。谢谢,

马蒂斯

@larnu 的回答完成了这项工作:

“至于问题,将更新 [SomeSchema].[TestTable] 替换为更新 _a。您将 FROM 中的表引用为 UPDATE 的列,但您更新的表被定义为 [TestTable] 的不同实例”

WITH NewData AS 
(
    SELECT * FROM ( VALUES  ('abc', 'a'),('def','d'),('ghi','g')) 
    x 
    (TextField, updateField)
)
update _tt
set _tt.updateField= _nd.updateField
from 
[SomeSchema].[TestTable] _tt
left join
NewData _nd 
on _tt.TextField=_nd.TextField

标签: sqlsql-serverjoinsql-update

解决方案


推荐阅读