在 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)
我想在 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)