2009-09-14 18 views
1

我需要将纯文本列中的数据转换为xml列。但是,并非所有内容都是有效的XML,所以我需要忽略具有无效XML的任何行。有没有一种方法可以使用某种内联条件转换或WHERE子句中的某些内容过滤掉无效数据?SQL Server:使用XML进行内联条件转换?

+0

什么版本的SQL Server? – 2009-09-14 23:49:20

+0

SQL 2005 15char – 2009-09-15 00:10:07

回答

1

听起来你需要为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在函数内部是不允许的。

+0

游标解决方案就是我已经完成的,所以荣誉:D – 2009-09-15 15:19:33