【发布时间】:2023-03-25 21:45:02
【问题描述】:
我需要将纯文本列中的数据转换为 xml 列。但是,并非所有内容都是有效的 XML,因此我需要忽略任何包含无效 XML 的行。有没有办法可以使用某种内联条件转换或 WHERE 子句中的某些东西来过滤掉无效数据?
【问题讨论】:
标签: sql sql-server xml sql-server-2005 tsql
我需要将纯文本列中的数据转换为 xml 列。但是,并非所有内容都是有效的 XML,因此我需要忽略任何包含无效 XML 的行。有没有办法可以使用某种内联条件转换或 WHERE 子句中的某些东西来过滤掉无效数据?
【问题讨论】:
标签: sql sql-server xml sql-server-2005 tsql
听起来您需要一个用于 XML 数据的 ISNUMERIC 函数版本。
很遗憾,不存在这样的内置函数 - 因此您必须设计自己的替代方案,有几个选项可供选择:
如果这是一个一次性或小规模的过程,其性能并不重要,您可以在游标内一次处理一行输入表,使用TRY...CATCH 块来处理无效转换(未经测试) :
DECLARE xmlCur CURSOR FOR
SELECT textcol
FROM inputTable
OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml
FETCH NEXT FROM xmlCur into @string
WHILE @@fetch_status = 0
BEGIN
BEGIN TRY
SET @xml = CAST(@string AS XML)
-- Do something with XML
END TRY
BEGIN CATCH
-- log failure/mark source row as invalid
END CATCH
FETCH NEXT FROM xmlCur into @string
END
CLOSE xmlCur
DEALLOCATE xmlCur
或者,如果您对 .Net 编程感到满意(并且它已在您的服务器上启用),您可以使用 CLR 创建您自己的 IsXML 函数。 .Net 代码不会比this thread 上的第三个帖子复杂多少。
CLR 解决方案的性能可能并不比游标好多少 - 您需要进行测试才能确定这一点。
(一个明显的尝试但不起作用的是标量值 T-SQL 函数,它尝试将字段转换为 TRY...CATCH 块内的 XML。但是,TRY...CATCH 不允许在功能。)
【讨论】: