【发布时间】:2017-08-26 04:52:00
【问题描述】:
我们最近从 SQL Server 2012 迁移到 SQL Server 2014,我们所有的 FOR XML 代码开始抛出有关不可打印的 ASCII 字符的错误。
我写了这个 horrible 函数来删除不可打印的 ASCII 字符作为快速修复。我想用更清洁的东西代替它。有没有办法做到这一点?
ALTER FUNCTION [dbo].[remove_non_printable_chars]
(@input_string nvarchar(max))
RETURNS nvarchar(max)
BEGIN
RETURN
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(@input_string,
CHAR(1), ''),CHAR(2), ''),CHAR(3), ''),CHAR(4), ''),CHAR(5), ''),CHAR(6), ''),CHAR(7), ''),CHAR(8), ''),CHAR(9), ''),CHAR(10), ''),
CHAR(11), ''),CHAR(12), ''),CHAR(13), ''),CHAR(14), ''),CHAR(15), ''),CHAR(16), ''),CHAR(17), ''),CHAR(18), ''),CHAR(19), ''),CHAR(20), ''),
CHAR(21), ''),CHAR(22), ''),CHAR(23), ''),CHAR(24), ''),CHAR(25), ''),CHAR(26), ''),CHAR(27), ''),CHAR(28), ''),CHAR(29), ''),CHAR(30), ''),
CHAR(31), ''), NCHAR(0) COLLATE Latin1_General_100_BIN2, '')
END
这是损坏的FOR XML 代码。 (这不是我写的。它已经在代码库中了)。
SELECT @HTMLTableData =
(
SELECT HTMLRows
FROM (
SELECT N'<tr>' + HTMLRow + N'</tr>' AS HTMLRows
FROM @HTMLRowData
) mi
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)')
【问题讨论】:
-
这有点麻烦,但嵌套替换是删除这些特定字符所必须发生的事情。嵌套替换也超级快。您可能会考虑将其转换为内联表值函数而不是标量函数。 FWIW,我不认为这个功能很可怕。需要很多丑陋的代码……首先是功能的重点。 :)
-
我会在 codereview.stackexchange.com 上发布这个
-
@SeanLange 谢谢你的好话 :)
-
这句话让我思考:我们最近从 SQL Server 2012 迁移到 SQL Server 2014,我们所有的 FOR XML 代码开始抛出有关不可打印的 ASCII 字符的错误。 为什么以及哪些错误? 您是如何创建 XML 的?这不应该发生...阅读XY-Problem 可能有助于展示一些在 SS12 中有效但不适用于 SS14 的示例。我很确定,问题 - 及其解决方案! - 在别的地方...
标签: sql-server sql-server-2014