Sql server 2008 将字符串转换为uniqueidentifier时抑制错误
我有一个通过XML接收唯一标识符列表的存储过程。一个或多个字符串可能不是有效的唯一标识符。SQLServer在此转换时引发异常,整个过程中止 是否可以抑制这些错误并继续?如果除一个id之外的所有id都有效,我需要有效id的所有数据,而不是一条错误消息,说明一个id解析失败 相关的选择:Sql server 2008 将字符串转换为uniqueidentifier时抑制错误,sql-server-2008,stored-procedures,error-handling,uniqueidentifier,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 JO
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>
7B8CFAED-8C59-431D-9447-2A45BD4612E5
537F4129-0732-4D29-B3B8-4B9127F8522F
9965395A-676F-48F2-91CC-F46527D134C
一种可能是将uniqueidentifier转换为varchar,而不是相反,但这会对性能造成影响,因为uniqueidentifier是成员表上的索引。读取打开的xml不会改变性能,无论在其中找到的数据类型如何。您是否考虑过这样做(主要是伪):
正如我所建议的,在SQL Server 2012中,这更容易实现。我认为,如果GUID列上的索引有很大帮助,那么将这些行写入#temp表不会对整体性能产生太大的影响。遗憾的是,ISNUMERIC()和ISDATE()没有ISUNIQUEIDENTIFIER()的补充。在SQL Server 2012中,可以将最后一个表结构包装在子查询中,并使用TRY\u CONVERT()。您是否使用过任何较新的XML方法?老实说,我很惊讶OPENXML还能工作。:-)谢谢,这种方法确实有效。然而,2008年的模式匹配似乎严重不足。
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;