Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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在字符串中查找不可打印的字符_Sql_Sql Server_Tsql - Fatal编程技术网

sql在字符串中查找不可打印的字符

sql在字符串中查找不可打印的字符,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的一个SQL查询返回数据中不可打印的字符,因此我在报告中得到一个错误。请告诉我如何在T-SQL中检查字符串是否有不可打印的字符,以便找到这些行并修复数据?提前感谢。这是: 它有两个部分,一个是生成一个带有数字的表 动态使用NumX CTE,然后将列切片到单个 字符,检查每个字符是否在范围内,然后跳过它, 最后使用FOR XML PATH连接回单个值 我发现某些列具有导致此问题的字符CHAR0。我用null替换了它们,它起了作用。当您不知道是哪个不可打印字符导致了问题,但您已经识别了记录: 在M

我的一个SQL查询返回数据中不可打印的字符,因此我在报告中得到一个错误。请告诉我如何在T-SQL中检查字符串是否有不可打印的字符,以便找到这些行并修复数据?提前感谢。

这是:

它有两个部分,一个是生成一个带有数字的表 动态使用NumX CTE,然后将列切片到单个 字符,检查每个字符是否在范围内,然后跳过它, 最后使用FOR XML PATH连接回单个值


我发现某些列具有导致此问题的字符CHAR0。我用null替换了它们,它起了作用。

当您不知道是哪个不可打印字符导致了问题,但您已经识别了记录:

在ManagementStudio中运行查询,并从网格中复制单个已知字段和问题 将字段粘贴到十六进制编辑器中粘贴到文本部分,以便可以看到字符的十六进制 如有必要,根据ASCII图表查找有问题的字符
现在,您可以使用替换进行更新来清理数据,也可以在查询本身中执行清理,因为现在您知道问题的原因。

您知道的是同一个不可打印字符吗?
WITH Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
UpdateCTE
AS
(SELECT keycol, DesNM,
(SELECT CASE WHEN ASCII(SUBSTRING(DesNM, n, 1))
BETWEEN 0x00 AND 0x1F
THEN ''
ELSE SUBSTRING(DesNM, n, 1)
END + ''
FROM I2DE AS B
JOIN Nums
ON n <= LEN(DesNM)
WHERE B.keycol = A.keycol
FOR XML PATH('')) AS DesNM_clean
FROM I2DE AS A)
UPDATE UpdateCTE
SET DesNM = DesNM_clean;