Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008:替换字符串_Sql_Sql Server_Tsql_String - Fatal编程技术网

SQL Server 2008:替换字符串

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可能将其归类为一个字符(

我有一张有错误符号的桌子�') 在一列中的多行中

下面的TSQL脚本不起作用

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 server
UNICODE
函数来显示结果,所以实际的错误字符被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 '%�%'