在 SQL Server Business Intelligence Development Studio 中将多值参数转换为临时表

Dav*_*gue 2 sql-server parameters bids temp-tables sql-server-2008

我想在 MS SQL Server BIDS(SSMS 和 Visual Studio)中创建一个报告。用户将输入电子邮件地址列表作为参数。所以@pEmails 将是“foo@bluh.com”、“bar@meh.org”等。这些电子邮件地址可能在也可能不在表中。

我可以简单地做:

and Table.Email in (@pEmails)

这行得通,除非我还需要返回电子邮件地址(如果找不到)。所以结果将是这样的:

|email       |found in table|  
|------------|--------------|  
|foo@bluh.com|  Y           |  
|bar@meh.org |  N           |
Run Code Online (Sandbox Code Playgroud)

我想我可以将输入的值列表作为@pEmails 参数并用它们创建一个临时表,然后我可以将其加入,但我这样做的尝试没有成功。

declare @pEmails table (EmailAddress varchar(255));
insert into @pEmails values (@ReportParameter1);

select
*
from
@pEmails
Run Code Online (Sandbox Code Playgroud)

如果只将单个值放入@ReportParameter1,则上述方法有效,但如果其中包含多个值,则无效。

我正在使用 SQL Server 2008。有关如何最好地进行的任何建议?

Gar*_*thD 5

如前所述,您需要某种拆分函数,以分析各种方法的性能以正确的方式拆分字符串 - 或者下一个最佳方式是出色的阅读。获得函数后,您需要将查询参数定义为字符串,而不是表:

所以你的查询实际上会变成:

DECLARE @pEmails TABLE (EmailAddress varchar(255));

INSERT @pEmails (EmailAddress)
SELECT  Value
FROM    dbo.Split(@pEmallString);
Run Code Online (Sandbox Code Playgroud)

然后转到您的数据集属性,而不是将多值参数传递@pEmails给数据集,而是创建一个新的@pEmailString,并将值设置为表达式,它应该是:

=Join(Parameters!pEmails.Value, ",")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这会将您的多值参数转换为单个逗号分隔的字符串。您需要将其转换为分隔字符串,然后在 SQL 中将其拆分,这似乎很倒退,不幸的是我不知道更好的方法。