У меня есть переменная, которая определяется следующим образом:
DECLARE @list MYDB.dbo.MessageList
Пользовательский тип MessageList
содержит около 15 полей, каждое из которых может быть пустым (включая ID).
Я получаю @list
в хранимой процедуре, которую я редактирую, и для каждой строки в @list
мне нужно превратить эту строку в XML и передать ее другой хранимой процедуре.
Прежде всего, Я пытался выбрать одну строку из MessageList
за другой на основе идентификатора, но, как оказалось, все MessageList.Id
равны NULL
. Затем я попытался использовать курсоры, но у меня проблемы с выполнением этой работы (синтаксические ошибки). Оба способа возникли из ответов, приведенных здесь: L oop через все строки временной таблицы и вызов хранимой процедуры для каждой строки
В случае курсоров проблема, как представляется, заключается в том, что Я не могу сделать DECLARE cur CURSOR FOR SELECT * FROM @list FOR XML RAW, BINARY BASE64, TYPE
так, как мне нужно, похоже, мне нужно сначала получить саму запись, а затем преобразовать ее в XML перед ее использованием.
Было бы здорово, если бы кто-то мог предложить способ чтобы сделать это без необходимости объявлять 15 или около того переменных, отдельно для каждого поля MessageList
, а затем каким-то образом соединить их после получения их с помощью курсора.
Это будет работать так, но я действительно очень не нравится это решение. Должно быть что-то лучше.
DECLARE @MessageList_Id int, @MessageList_Foo int, @MessageList_Bar varchar(64), ...
DECLARE cur CURSOR FOR SELECT Id, Foo, Bar, ...
OPEN cur
FETCH NEXT FROM cur INTO @MessageList_Id, @MessageList_Foo, @MessageList_Bar, ...
-- Somehow put all those variables together into single row, then use row FOR XML RAW, BINARY BASE64, Type;
-- ...
Что мне нужно сделать: для каждой строки в таблице преобразовать строку в XML и выполнить хранимую процедуру с XML строки как параметр.