将字符串转换为uniqueidentifier时抑制错误

时间:2012-05-02 19:00:42

标签: sql-server-2008 stored-procedures error-handling uniqueidentifier

我有一个存储过程,它通过XML接收唯一标识符列表。一个或多个字符串可能不是有效的唯一标识符。 SQLServer在此转换时抛出异常,整个过程中止。

是否可以抑制这些错误并继续?如果除了其中一个ID之外的所有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>

一种可能性是将uniqueidentifier转换为varchar而不是相反,但这会导致性能影响,因为uniqueidentifier是成员表的索引。

1 个答案:

答案 0 :(得分:1)

无论内部发现的数据类型如何,读取open 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列上的索引。