Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将字符串转换为uniqueidentifier时抑制错误_Sql Server 2008_Stored Procedures_Error Handling_Uniqueidentifier - Fatal编程技术网

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

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

我有一个通过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>

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;