我正在使用SQL Server 2008 RC2。
我们经常必须执行类似于以下的查询:
select * from Site s where s.name in (:names)
其中
":names"
是一个很大的StringBuilder
,包含1000个逗号分隔的18个字节的名称。这需要一段时间才能运行;在本地开发计算机上最多需要一分钟。我知道许多人建议为此使用Table Valued Parameters
(TVP),例如以下示例:create procedure [dbo].[sp_TestSites] @siteNames SiteNameTableType readonly
as
begin
select s.* from Site s
inner join @siteNames d on d.name = s.name
end
但是,由于Microsoft JDBC驱动程序仍然不支持TVP(据我所知),实现此目的的最佳方法是什么?将一个长的逗号分隔值字符串发送到存储过程,然后在该过程中拆分该字符串并插入到临时表中?例:
create type dbo.SiteNameTableType as table(
name varchar(18) not null unique
)
create procedure sp_TestSites(
@longStringOfNames varchar(max))
as
begin
declare @siteNames SiteNameTableType
insert into @siteNames
select * from dbo.split(@longStringOfNames) -- assume I have a Split function
select s.* from Site s
inner join @siteNames d on d.name = s.name
end
最佳答案
正如我在评论中提到的那样,您可以将数据准备为XML字符串并将其传递给存储过程。在SP内,您可以查询该XML并根据需要加入结果集。