IF OBJECT_ID('tempdb..#TempList') IS NOT NULL
DROP TABLE #TempList
CREATE TABLE #TempList (
VarName NVARCHAR(10) ,
VarValue NVARCHAR(10),
VarValueNext NVARCHAR(10)
)
INSERT INTO #TempList
VALUES ('Fred',NULL, NULL),
('Wilma',NULL, NULL),
('Barney',NULL, NULL),
('Betty',NULL, NULL)
;WITH cte_name AS (
SELECT *
FROM #TempList
)
UPDATE cte_name
SET cte_name.VarValue = 'Fred' WHERE cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney'
-- , cte_name.VarValueNext = 'Pebbles' WHERE cte_name.VarValue = 'Fred' and cte_name.VarName = 'Wilma'
SELECT *
FROM #TempList
我知道这是一个不保证使用CTE结构的简单示例。我试图了解UPDATE块是如何受到影响的。
我想设置多个字段的值。一旦我引入WHERE子句,看起来我只能设置一个值。
我做错了什么?
谢谢, 蒂斯
答案 0 :(得分:3)
您需要在这里使用case表达式而不是where子句。请记住,where子句会过滤查询中的行。我觉得你对那里的语法有点困惑。以下是此类更新的外观。
UPDATE cte_name
SET VarValue = case when VarName IN('Wilma', 'Barney') then 'Fred' else VarName end
, VarValueNext = case when VarValue IN('Wilma', 'Barney') then 'Pebbles' else VarValueNext end
答案 1 :(得分:2)
如果没有错,你需要这样的东西
UPDATE #TempList
SET VarValue = CASE
WHEN VarName IN ( 'Wilma', 'Barney' ) THEN 'Fred'
ELSE VarValue
END,
VarValueNext = CASE
WHEN VarValue IN ( 'Fred', 'Wilma' ) THEN 'Pebbles'
ELSE VarValueNext
END
WHERE VarName IN ( 'Wilma', 'Barney' )
OR VarValue IN ( 'Fred', 'Wilma' )
答案 2 :(得分:0)
Sean Lange指出我的错误 - 每个UPDATE一个WHERE子句,而不是每个SET。
为了完整起见,这是一个有效的解决方案。
感谢所有人的帮助 - 非常感谢。有些日子......; - )
IF OBJECT_ID('tempdb..#TempList') IS NOT NULL
DROP TABLE #TempList
CREATE TABLE #TempList (
VarName NVARCHAR(10) ,
VarValue NVARCHAR(10),
VarValueNext NVARCHAR(10)
)
INSERT INTO #TempList
VALUES ('Fred',NULL, NULL),
('Wilma',NULL, NULL),
('Barney',NULL, NULL),
('Betty',NULL, NULL)
;WITH cte_name AS (
SELECT *
FROM #TempList
)
UPDATE cte_name
SET cte_name.VarValue =
CASE
WHEN cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney'
THEN 'Fred'
END
, cte_name.VarValueNext =
CASE
WHEN cte_name.VarName = 'Betty' OR cte_name.VarName = 'Wilma'
THEN 'Bosses'
END
SELECT *
FROM #TempList