2

У меня есть хранимая процедура, которая получает список уникальных идентификаторов через XML. Возможно, что одна или несколько строк не будут действительным уникальным идентификатором. SQLServer выдает исключение при этом преобразовании, и вся процедура прерывается.Подавление ошибок при преобразовании строк в uniqueidentifier

Можно ли устранить эти ошибки и продолжить? Если все, кроме одного из идентификаторов, действительны, я хочу, чтобы все данные были действительными идентификаторами, а не сообщение об ошибке, в котором один идентификатор не смог разобрать.

Соответствующий выбор:

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

К сожалению, ISUNIQUEIDENTIFIER() не является дополнением к ISNUMERIC() и ISDATE(). В 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