我正在使用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并根据需要加入结果集。

09-10 20:20