2

我有一个存储过程,通过XML接收唯一标识符列表。有可能一个或多个字符串不会成为有效的唯一标识符。 SQLServer在此转换时抛出异常,并且整个过程中止。将字符串转换为uniqueidentifier时抑制错误

是否可以抑制这些错误并继续?如果除了其中一个ID都有效,我想要有效ID的所有数据,而不是错误消息,说明一个ID无法解析。

相关的选择:

SELECT * 
FROM dbo.Daily dd   
    INNER JOIN dbo.Member m ON m.MemberId = dd.MemberID 
    INNER JOIN OPENXML(@hdoc, 'list_of_guids/id/text()', 1) with (guid uniqueidentifier '.') x 
      ON x.guid = m.MemberGuid 

示例XML,注意最后一项是无效的:

<list_of_guids> 
<guid>7B8CFAED-8C59-431D-9447-2A45BD4612E5</guid> 
<guid>537F4129-0732-4D29-B3B8-4B9127F8522F</guid> 
<guid>9965395A-676F-48F2-91CC-F46527D134C</guid> 
</list_of_guids> 

一种可能性是将uniqueidentifiers转换为varchar,而不是周围的其他方法,但这会对性能造成影响,因为uniqueidentifier是成员表上的索引。

+0

遗憾的是ISNUMERIC()和ISDATE()没有ISUNIQUEIDENTIFIER()补充。在SQL Server 2012中,您可以将最后一个表结构包装在子查询中,并使用TRY_CONVERT()。你玩过任何新的XML方法吗?我很惊讶OPENXML仍然有效,说实话。 :-) –

回答

1

读取打开的xml不会改变性能,不管里面的数据类型如何。你有没有考虑做这样的事情(主要是伪):

SELECT * FROM OPENXML ... INTO #tmp; -- using VARCHAR type, not GUID 

DELETE #tmp WHERE col NOT LIKE '[0-9A-F]...' -- delete those not matching pattern 
    OR col IS NULL; 

ALTER TABLE #tmp ALTER COLUMN col UNIQUEIDENTIFER; 
-- create index here too maybe 

SELECT FROM #tmp JOIN other tables; 

正如我建议这是SQL Server 2012中更容易,我不认为写的那些行到#TEMP表都不会改变整体性能如此之大,如果大的帮助是GUID列上的索引。

+0

谢谢,这种方法确实有效。尽管如此,2008年的模式匹配看起来还是非常糟糕。 – DylanStreb

相关问题