我遇到了需要删除字符‘’的情况来自特定表中具有唯一性约束的VARCHAR。我更喜欢在SQL中完成这项工作,而不是自定义应用程序代码。我有进行更改的逻辑,但我正在努力克服VARCHAR上的唯一性约束。
下面是我的测试表:
CREATE TABLE [dbo].[TableName] (
[TableNameID] INT IDENTITY (1, 1) NOT NULL,
[TableInfo] VARCHAR (128) NOT NULL,
CONSTRAINT [unq_TableName] UNIQUE NONCLUSTERED ([TableInfo] ASC)
)
下面是执行替换的逻辑(不处理唯一性约束):
UPDATE TableName
SET TableInfo = REPLACE(TableInfo, '.', '_')
WHERE TableInfo LIKE '%.%'
我正在尝试克服我用以下数据集创建的测试:
TableNameID | TableInfo
-------------------------
1 | Test
2 | Test.
3 | Test_
4 | Test__
在这方面的任何帮助都将非常感谢。
发布于 2013-11-11 22:26:06
它应该是唯一的吗?如果答案是“是”,那么你必须设法找出如何消除重复数据。在您的示例中,您如何处理ID 3?您将使用TableInfo = 'Test_‘创建两条记录。你必须开发出某种方法来组合或消除其中的一个。
如果答案是“否”,那么简单地删除约束。
发布于 2013-11-11 22:37:06
您可以这样做:
您可以创建另一个具有多个计数的查询,以查找重复项并根据需要使用它们。
这是一个示例:
UPDATE TableToUpdate
SET columnToUpdate = REPLACE(columnToUpdate, '.', '')
FROM ( SELECT COUNT(*) AS Count ,
ID
FROM TableToUpdate
GROUP BY columnToUpdate
HAVING ( COUNT(*) < 2 )
) AS QueryData
WHERE tableToUpdate.ID = QueryData.ID
发布于 2013-11-12 00:53:47
如果您知道要更新的行的PK,则此代码有效:-
declare @unique varchar(50)
set @unique = ''
while 1=1 begin
set @unique+='_'
update t set
t.TableInfo = replace(t.TableInfo, '.', @unique)
from dbo.tablename t
where t.TableNameID=2 --t.tableinfo like '%.%'
and not exists(
select *
from dbo.TableName csq
where csq.TableInfo = replace(t.TableInfo, '.', @unique)
)
if @@rowcount=1
break
end
代码是脆弱的,例如,如果TableInfo列的宽度不足以通过附加多个下划线来创建唯一键,则该代码将失败。
枚举需要更新的记录集上的游标-然后为每个PK调用此代码应该很简单(或者将其转换为UDF并使用cross apply
调用它)。
我将不得不更努力地思考如何让它基于set工作。当我睡了一觉后,我可能会带着不同的答案回来。
https://stackoverflow.com/questions/19917133
复制相似问题