SQL CLR — получение данных/обновление результатов

В рамках моей бизнес-логики мне нужно получить более 2000 строк из таблицы sql. Пропустите эти строки через некоторую сложную, процедурную, бизнес-логику (да, она должна быть процедурной, и все методы бегущей суммы, которые я исследую до сих пор, не сокращают ее для эффективности). Затем я должен обновить базу данных и вернуть результаты.

Использование SQLDataReader - данные передаются из SQL в мою логику - что работает просто отлично.

Логика перебирает данные и вносит необходимые изменения.

Теперь, чтобы сохранить изменения - я действительно не хочу отправлять результат, заполняя параметры в операторе UPDATE. Если бы у меня были результаты в SQL, я бы соединил временную таблицу с базовой и выполнил все обновления в одном операторе TSQL Update. По моему "таблица" находится в SQL CLR, а базовая таблица закончилась на стороне SQL.

Я прочитал методы сериализации результатов в XML и перенес все это с помощью переменной varchar, но я использую SQL Server 2008 R2.

Я просмотрел UDT и параметры табличных значений, но вы не можете использовать их для передачи данных между SQL CLR и SQL.

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


person codeputer    schedule 01.09.2011    source источник
comment
Я думал, что SQL CLR был разработан, чтобы быть помещенным в DLL и запускаться изнутри сервера.   -  person Nik    schedule 02.09.2011


Ответы (1)


Для того, чтобы обновить сразу все ваши столбцы, в различных записях за один вызов базы данных вы правильно используете XML. Ниже приведен пример запроса, который вы можете использовать.

if OBJECT_ID('sample1') is not null
drop table sample1
go
create table sample1(id int identity(1,1), firstname varchar(100), lastname varchar(100))
go

declare @xmldata xml
set @xmldata  = 
N'<sample>
        <data>
            <firstname>Jay</firstname>
            <lastname>Keni</lastname>
        </data>
        <data>
            <firstname>Lid</firstname>
            <lastname>kurtis</lastname>
        </data>
        <data>
            <firstname>Lea</firstname>
            <lastname>Cortez</lastname>
        </data>
</sample>'


declare @xml_hndl int
exec sp_xml_preparedocument @xml_hndl OUTPUT, @xmldata

insert sample1(firstname, lastname)
select up.firstname, up.lastname
FROM OPENXML(@xml_hndl, '/sample/data',2)
WITH  (firstname varchar(100),lastname varchar(100))up

EXEC sp_xml_removedocument @xml_hndl

select * from sample1

вы можете выполнять обновления, вставки, удаления и любую операцию соединения, которую вы хотите, этот код будет работать от SQL Server 2005 до denali.

person helpwithdotnet    schedule 02.09.2011
comment
Думали ли вы об использовании FileStream в 2008 году для потоковой передачи результатов из SQL CLR в объект FileStream. Затем используйте другую хранимую процедуру для извлечения FileStream и (каким-то образом) создайте TVF для извлечения двоичных результатов в строках? Мне нравится XML, но он кажется слишком многословным, особенно с большими результатами. - person codeputer; 02.09.2011