SQL Server 2008:替换字符串
我有一张有错误符号的桌子�') 在一列中的多行中 下面的TSQL脚本不起作用SQL Server 2008:替换字符串,sql,sql-server,tsql,string,Sql,Sql Server,Tsql,String,我有一张有错误符号的桌子�') 在一列中的多行中 下面的TSQL脚本不起作用 UPDATE S SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...') FROM tblSacrifices S 该列的数据类型为nvarchar(230),允许空条目 数据来自一个通过Visual studio windows应用程序从Excel和d转换而来的csv文件。数据最初是“…”,但我认为word/Excel可能将其归类为一个字符(
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...')
FROM tblSacrifices S
该列的数据类型为nvarchar(230),允许空条目
数据来自一个通过Visual studio windows应用程序从Excel和d转换而来的csv文件。数据最初是“…”,但我认为word/Excel可能将其归类为一个字符(而不是3个单独的“.”)。当我的应用程序从csv文件中读取原始字符串时,它(无意中)将“…”替换为“…”�' 在将数据提交到数据库之前
请帮助尝试使用前导N明确表示您正在搜索的字符是nvarchar:
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, N'�', '...')
FROM tblSacrifices S
更新
根据Martin回答的讨论:
我没有理由认为这在功能上与我上面发布的有所不同,但您可以尝试:
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(65533), '...')
FROM tblSacrifices S
更新2
在更新我的答案之前,我没有仔细阅读Martin的代码。因为它使用SQL serverUNICODE
函数来显示结果,所以实际的错误字符被65533掩盖了
有关unicode字符65533的详细信息,请参阅。这是用于错误数据的通用unicode值。编辑: 在评论中更新后,请尝试替换(S.S.U.U.详细信息,nchar(65533),“…”) 原始答案: 这可能会帮助您排除故障
declare @s nvarchar(230)
SELECT @s= ProblemCol
FROM YourTable
WHERE ProblemRowId = X;
set @s = N'日本国'; /*For testing*/
WITH N AS
(SELECT 1 idx,
LEFT(@s,1)ch,
UNICODE(LEFT(@s,1)) C
UNION ALL
SELECT idx+1,
SUBSTRING(@s,idx+1,1),
UNICODE(SUBSTRING(@s,idx+1,1)) C
FROM N
WHERE idx<LEN(@s)
)
SELECT idx, ch,C
FROM N
我明白了。
谢谢大家的帮助
我必须转换成二进制。所有超过65500的unicode字符都需要这个,因为普通的REPLACE()不起作用
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, nchar(65533) COLLATE Latin1_General_BIN, '...')
FROM tblSacrifices S
像这样使用Unicode函数,它可能会帮助您:
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...')
FROM tblSacrifices S where S.Offering_Details like '%�%'
受影响列的数据类型是什么?它是nvarchar(230)。此外,该列允许空值(如果这有区别的话).您是否绝对确定数据中的符号是带问号的黑钻石,而不是因为字符集问题才显示出来?或者可能是因为您使用的字体无法显示字符?Martin,您可能在那里看到了一些东西。数据最初是“…”但我想可能是这样的aps word/excel将其归类为一个字符(而不是3个单独的“.”)。当我的应用程序从CSV文件中读取原始字符串时,它将“…”替换为“�' 在将数据提交到数据库之前。谢谢Ed,但这也不起作用。请参阅我在原始帖子中对Martin的回复。一些额外的信息可能有助于回答这个问题。再次感谢你们。你们可能已经知道这也不起作用。是否有办法删除“坏数据”,然后替换我们不知道该把它放在哪里。我被卡住了!顺便说一句——“结果到文本”在management studio中处理这些字符似乎比处理网格中的结果要好——至少在我的设置中是这样。谢谢Martin,我已经将结果放在了我的原始帖子中。它们和你的一样。我不确定这意味着什么。@Chris-是的,很抱歉我想让你删除这一行
set@s=N'日本国'; /*对于测试*/
来说,它只是演示了它将返回什么。一旦你发现问题字符代码,你可以用nchar(26085)
或其他任何东西来替换它们,如果你只是想摆脱它们。我现在明白了,结果返回了65533的符号值�'.@克里斯-如果神秘人物的小数点是65533,我很有信心我的答案中的脚本会起作用。你正在用三个字符替换一个字符,这样结果会更长。你能不能不使用省略号单个字符'N'…'`(否则,我认为您需要将列加宽,或使用LEFT
自行截断,或将ANSI_WARNINGS设置为OFF
以忽略错误并允许截断。我明白了,谢谢Martin。我只是扩展了列的最大允许字符数,因为我不想丢失任何数据。
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...')
FROM tblSacrifices S where S.Offering_Details like '%�%'