作为业务逻辑的一部分,我必须从sql表中检索2000多行。通过一些复杂的,程序性的业务逻辑来运行这些行(是的,它必须是程序性的,并且到目前为止我研究的所有运行总和技术都没有为了效率而削减它)。然后我必须更新数据库,并返回结果。
使用SQLDataReader - 数据从SQL流入我的逻辑 - 这很好用。
逻辑迭代数据,并进行必要的更改。
现在保存更改 - 我真的不希望通过将参数填充到UPDATE语句来发送结果。如果我在SQL中得到结果,我会将临时表与基表连接,并在单个TSQL Update语句中执行所有更新。我的“表”在SQL CLR中,基表在SQL端结束。
我已经阅读了将结果序列化为XML并将其全部传输到varchar变量中的技术 - 但我使用的是SQL Server 2008 R2。
我查看了UDT和表值参数 - 但是你不能使用它们在SQL CLR和SQL之间传输数据。
如果假设SQL CLR与复杂的业务逻辑一起使用 - 是不是有最佳实践方法来发送数据?我还没有找到一个直接解决或讨论这个问题的例子。
答案 0 :(得分: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。