【发布时间】:2013-07-27 19:24:11
【问题描述】:
我有两张表,Table1 和 Table2,它们有 N 个编号。的列。我需要根据 Table2 更新 Table1。我想更新 Table1 中的所有列,这些列在 Table2 的单个列中列出。
E.G
Table1 A B C D E . . .
1 2 3 4 5 . . .
7 6 5 4 3 . . .
Table2 X Y Col_Nam Col_Value
1 2 C 8
1 2 D 9
7 6 E 10
7 6 C 20
. . . .
. . . .
当满足以下条件Table1.A = Table2.X时,更新Table1中所有列在Table2中的列 和 Table1.B = Table2.Y
平台是 SQL Server。 我正在寻找的是一个动态的解决方案,因为我不知道我要更新的列名。表1可以有N个。需要更新的列。我使用光标尝试了以下操作。
DECLARE @s Varchar(MAX), @key1 VARCHAR(MAX), @key2 VARCHAR(MAX), @Cname VARCHAR(MAX), @CValue VARCHAR(MAX)
DECLARE crs CURSOR FOR SELECT * FROM Table2
OPEN crs;
FETCH NEXT FROM crs inTO @key1,@key2,@Cname,@Cvalue;
WHILE @@FETCH_STATUS = 0
BEGIN
set @s =
'Update T1 SET ' + @FieldName + ' = ''' + @FieldValue +
''' from Table1 T1' +
' where T1.A = ''' + @key1 +
''' and T1.B = ''' + @key2
exec(@s)
FETCH NEXT FROM crs inTO @key1,@key2,@Cname,@Cvalue;
END
CLOSE crs
DEALLOCATE crs
不知何故它不起作用,我想为所有不匹配 where 条件的记录设置一个默认值。
任何其他解决方案或帮助将不胜感激。
【问题讨论】:
-
有一种标准的方法可以做到这一点,但特定平台(SQL Server、Oracle、DB2、mySql 等)具有更快的“快捷方式”。什么平台?
-
@JamesMohler 我更新了标题。
-
这个问题已经讨论过很多次了,请在发这个之前,你应该做一个更好的搜索。你也应该指定平台,这很重要。
-
@Hogan 因为之前应该指定 sql 平台。
标签: sql sql-server