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

相關問題