SQL CLR - получение данных / обновление результатов - PullRequest
0 голосов
/ 02 сентября 2011

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 02 сентября 2011

Для того, чтобы обновить все ваши столбцы одновременно, в разных записях в одном обращении к базе данных вы вправе использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...