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

Turning a multi-value parameter into a temp table in SQL Server Business Intelligence Development Studio

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

我可以简单地做到:

and Table.Email in (@pEmails)

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

|email       |found in table|  
|------------|--------------|  
|foo@bluh.com|  Y           |  
|bar@meh.org |  N           |

我想我可以获取作为@pEmails 参数输入的值列表,并用它们创建一个临时 table,然后我可以离开加入,但我这样做的尝试没有奏效出去。

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

select
*
from
@pEmails

如果只有一个值被放入@ReportParameter1,以上方法有效,但如果其中有多个值则无效。

我正在使用 SQL Server 2008。关于如何最好地进行有什么建议吗?

如前所述,您需要某种拆分函数,以分析各种方法的性能 Split strings the right way – or the next best way 是一本很好的读物。拥有函数后,您需要将查询参数定义为字符串,而不是 table:

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

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

INSERT @pEmails (EmailAddress)
SELECT  Value
FROM    dbo.Split(@pEmallString);

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

=Join(Parameters!pEmails.Value, ",")

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

这里有一些关于这个主题的知识(站在这个线程其他地方的信息的肩膀上)。

设置参数(select 'multiple values' 复选框):

InputList

建立数据集查询:

SELECT * 
INTO #InputTemp 
FROM  STRING_SPLIT(@InputListJoin, ',')

SELECT value as ValueName
FROM #InputTemp T2
WHERE NOT EXISTS (
    SELECT MyValue
    FROM MyTable T1
    WHERE T1.MyValue = T2.value
    )

建立数据集参数:

Name: @InputList  |  Value: [@InputList]
Name: @InputListJoin  |  Value(expression): =Join(Parameters!InputList.Value,",")

可以根据需要更改元素名称。

有点切合主题,其他可能有用的详细信息:

[@InputList.IsMultiValue] --> true/false whether your parameter is multi-value (not whether there are multiple values)
[@InputList.Count] --> count of items in input list (excludes blank lines)
=Parameters!InputList.Value(2) --> return third value from list (counting from zero)