如何在SQL server中使用替换更新多个列?

如何在SQL server中使用替换更新多个列?,sql,sql-server,sql-update,dynamic-sql,Sql,Sql Server,Sql Update,Dynamic Sql,如何更新表中的不同列和行?我想做点类似的事 我想这样做,但该值存在于同一类型的多个列中。这些值是employee表的外键VARCHAR。每列代表一项任务,因此同一员工可能被分配到一个记录中的多个任务,并且这些任务在不同的记录中会有所不同。我如何才能有效地做到这一点?基本上是替换整个表中所有不同的列 谢谢你的帮助和建议 干杯, ~ck在圣地亚哥这应该可以做到: UPDATE table1 SET field1 = replace(field1, 'oldstring', 'newstring'),

如何更新表中的不同列和行?我想做点类似的事

我想这样做,但该值存在于同一类型的多个列中。这些值是employee表的外键VARCHAR。每列代表一项任务,因此同一员工可能被分配到一个记录中的多个任务,并且这些任务在不同的记录中会有所不同。我如何才能有效地做到这一点?基本上是替换整个表中所有不同的列

谢谢你的帮助和建议

干杯,
~ck在圣地亚哥

这应该可以做到:

UPDATE table1
SET field1 = replace(field1, 'oldstring', 'newstring'),
    field2 = replace(field2, 'oldstring2', 'newstring2')

等。

回答海报关于如何规范此数据结构的补充问题。以下是您的做法:

Project
-------
ProjectID
ProjectName
etc...

Employee
--------
EmployeeID
EmployeeName
etc...

Task
----
TaskID
ProjectID
EmployeeID
TaskDescription
etc...
您当前的结构,其中有一组Task1、Task2等。。。项目表中的列显然不是由了解关系数据库的人设计的


在解雇此人的过程中,您可能会解释说他的设计违反了,同时将他引向该链接文章的“跨列重复组”部分。

主要思想是创建一个SQL更新语句,不管表中有多少字段。它是在SQLServer2012上创建的,但我认为它在2008年也可以使用

样本表:

CREATE TABLE SampleTable
(
    Field1 INT,
    Field2 VARCHAR(20),
    Field3 VARCHAR(20),
    Field4 VARCHAR(100),
    Field5 DATETIME,
    Field6 NVARCHAR(10)
);
仅获取varchar和nvarchar字段。根据您的要求更改旧文本新文本。如果您不仅需要匹配varchar和nvarchar字段,还需要更改系统类型id值

SELECT 'UPDATE dbo.SampleTable SET ' + STUFF((SELECT ', [' + name + '] =   REPLACE([' + name + '], ''OLD_TEXT'', ''NEW_TEXT'')' 
FROM sys.COLUMNS
WHERE 
    [OBJECT_ID] = OBJECT_ID('SampleTable')
    AND [is_identity] = 0 --It's not identity field
    AND [system_type_id] in (167, 231) -- varchar, nvarchar
FOR XML PATH('')), 1,1, '')
最后一次查询的结果是:

UPDATE dbo.SampleTable SET  
    [Field2] = REPLACE([Field2], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field3] = REPLACE([Field3], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field4] = REPLACE([Field4], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field6] = REPLACE([Field6], 'OLD_TEXT', 'NEW_TEXT');
只需复制结果并在SSMS中执行即可。在编写更新语句时,此代码段为您节省了一点时间


希望能有所帮助。

这表明您的数据库没有被删除?(即在3NF中)我更像是一个c#dev,所以我不知道数据库的内部工作原理。我很好奇你如何正确地表达这种关系?如果表中的每条记录表示一个项目,每列表示一项任务,则可以将员工分配到一个或多个任务。复制品在哪里?我该怎么补救呢?请给出建议。我认为你应该举一个例子,说明你拥有什么以及你想改变什么。如果不清楚数据是什么样子的,就很难制定SQL查询。通常,外键是int而不是varchar。这样,您就不会出现此类问题。这样,单个员工记录可以链接到多个任务,您只需使用员工的ID即可。您还可以有一个交叉引用表,将员工链接到任务。这意味着3个表,而不仅仅是2个表,但这是一件普通的事情。tEmpNum jEmpNum yEmpNum xEmpNum 0 15059 0 15059 13456 13456 13456 15059 15059 15059 15059 15059 15059 15059 15059 15059 15059 15059-我想将15059的每一次出现都更新到13673?虽然这些是数字,但许多值包含RH6754之类的文本。谢谢。:)如果列中不存在该字符串,是否可以?好的,听起来很酷。我会在所有可能的列中应用它???谢谢你的提示。我试试这个。好极了!请不要在生产系统上直接尝试(或者至少先做备份)。此外,您可以使用where子句来缩小范围(可能)。只是为了更新任何感兴趣的方;我遇到了一点问题。数据类型是varchar(7),如果“newstring”与“oldstring”的长度相同或更短,那么一切都很好,但当我试图转到另一个方向时,数据将被截断,错误会出现在它们丑陋的头部。我想到了一种效率较低的方法,那就是对存储过程中的每一列运行更新,如Begin update table1 SET field1='newstring',其中field1='oldstring'结束,然后对field2、field3、filedn执行相同的查询。我相信这是无效的,但结果是我所追求的。谢谢大家!哈哈,真可笑。任何人都不应该被解雇,因为他们的数据库设计有点不同,或者稍微去规范化了。向更有经验的人学习是有帮助的。再说她,不是他。是一只超级短裤。:)啊,那么所有的赌注都输掉了:)不管它值多少钱,这比“一点非规范化”要重要得多。这是第一个被违反的范式,而不是第三个。在某些情况下,需要以复制数据的方式展平表,但这里并不是这样。这只是痛苦的一代,没有任何好处。真棒的解决方案!