从SQL表中的行中删除尾随的":"字符

Mat*_*att 1 replace sql-server-2008

我有数百万行的表.对于每一行,都有一个nvarchar(max)列.当我填充数据库时,我忘了删除一个尾随的":"字符.什么是通过每一行并删除最后一个字符的最快/最有效的方法?

我认为必须有一个最快的方法来做到这一点,而不是使用看似昂贵的REPLACE.

这是SQL Server 2008

Ric*_*iwi 13

您可以使用替换字符串部分的STUFF函数.在这种情况下,它是最后一个字符.

UPDATE tbl
SET COL = stuff(COL, len(COL), 1, '')
WHERE COL > ''
Run Code Online (Sandbox Code Playgroud)

或者使用LEFT,除最后一个之外的所有内容.条件COL>''确保LEFT具有有效长度.LEFT是SQL Server中的一个快捷方式,似乎实现为SUBSTRING (请参见下文)*

UPDATE tbl
SET COL = LEFT(COL, len(COL) -1)
WHERE COL > ''
Run Code Online (Sandbox Code Playgroud)

如果您同时包含带有和不带有分号的数据,则可以专门定位它们

UPDATE tbl
SET COL = LEFT(COL, len(COL) -1)
WHERE RIGHT(COL,1) = ':'
Run Code Online (Sandbox Code Playgroud)

以下是使用LEFT的查询的查询计划(仅显示文本计划的前3行)

select LEFT(text, LEN(text)-1), * from master..syscomments
Run Code Online (Sandbox Code Playgroud)
  |--Compute Scalar(DEFINE:([Expr1061]=substring([Union1060],(1),len([Union1060])-(1))))
       |--Concatenation
            |--Compute Scalar(DEFINE:([Expr1005]=(0), [Expr1007]=(0)))
Run Code Online (Sandbox Code Playgroud)