我在数据库(SQL Server 2005)中有一个列,其末尾的数据为“\ 0”。在SQL Server中查询时,此字符不可见,并且“似乎”不存在。当我查看我的C#代码时,角色就在那里。此字符在我们的网站上导致错误,我们需要从所有受影响的行中删除它。
我是否可以编写一个SQL查询来轻松地从受影响的所有记录中删除此字符?我可以获取所有受影响的记录,但我没有办法将记录更新为新值(没有“\ 0”)。
更新: 这似乎有效:
Select * from TABLE
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0
所以:
Update TABLE
SET naughtyField = SUBSTRING(naughtyField, 1, LEN(naughtyField) - 1)
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0
答案 0 :(得分:10)
<击> UPDATE tbl SET col = REPLACE(col,char(0),'') 击>
编辑:只是为了兑换这个答案!对于字符串嵌入\0
s。
CREATE FUNCTION dbo.RemoveNullChars
(
@string NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX) WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
SET @Result = ''
DECLARE @counter INT
SET @counter = 0
WHILE (@counter <= LEN(@string))
BEGIN
IF UNICODE(SUBSTRING(@string,@counter,1)) <> 0
SET @Result = @Result + SUBSTRING(@string,@counter,1)
SET @counter = @counter + 1
END
RETURN @Result
END
然后
UPDATE tbl SET col = dbo.RemoveNullChars (col)
答案 1 :(得分:4)
...是否
UPDATE mytable
SET myfield = REPLACE(myfield, CHAR(0), '')
...工作?
SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1)
在那些以null结尾的字段上工作 - 但要注意不要在非NULL终止的字符串上使用它,否则你将丢失数据。
答案 2 :(得分:2)
我遇到了这个问题并且最近修了它。它似乎总是在字符串的末尾(因为它是终结符)。
另外,因为它不是空格,所以它会导致rtrim不能在具有额外尾随空格的字段上工作(例如'California \ 0')。
最安全的方法是从(0)到(最后一个'\ 0'索引或字符串长度,如果找不到'\ 0')的子串。
以下是我在我的案例中安全删除它的方法
substring([field], 0, ( LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1 ) )
这里正在移除它并修剪额外的空间。
ltrim(rtrim(substring([field], 0, ( LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1 ) ) ))