Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server Business Intelligence Development Studio中将多值参数转换为临时表_Sql Server_Sql Server 2008_Parameters_Temp Tables_Bids - Fatal编程技术网

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

Sql server 在SQL Server Business Intelligence Development Studio中将多值参数转换为临时表,sql-server,sql-server-2008,parameters,temp-tables,bids,Sql Server,Sql Server 2008,Parameters,Temp Tables,Bids,我想在MSSQLServer和VisualStudio中创建一个报表。用户将输入电子邮件地址列表作为参数。所以@pEmails将是'foo@bluh.com', 'bar@meh.org,等等。这些电子邮件地址可能在表中,也可能不在表中 我可以简单地做到: 和Table.Email@pEmails 这是可行的,除非我需要返回电子邮件地址,如果它没有找到。所以结果会是这样的: |email |found in table| |------------|--------------|

我想在MSSQLServer和VisualStudio中创建一个报表。用户将输入电子邮件地址列表作为参数。所以@pEmails将是'foo@bluh.com', 'bar@meh.org,等等。这些电子邮件地址可能在表中,也可能不在表中

我可以简单地做到:

和Table.Email@pEmails

这是可行的,除非我需要返回电子邮件地址,如果它没有找到。所以结果会是这样的:

|email       |found in table|  
|------------|--------------|  
|foo@bluh.com|  Y           |  
|bar@meh.org |  N           |
我在想,我可以将输入的值列表作为@pEmails参数,并用它们创建一个临时表,然后将其保留为join,但我的尝试没有成功

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

select
*
from
@pEmails
如果@ReportParameter1中只有一个值,但如果其中有多个值,则上述方法不起作用


我正在使用SQLServer2008。关于如何最好地继续进行的任何建议?

正如前面所述,您需要某种分割函数,因为分析各种方法的性能是一种极好的阅读。拥有函数后,需要将查询参数定义为字符串,而不是表:

因此,您的查询实际上会变成:

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

INSERT @pEmails (EmailAddress)
SELECT  Value
FROM    dbo.Split(@pEmallString);
然后转到数据集属性,并不是将多值参数@pEmails传递给数据集,而是创建一个新参数@pEmailString,并将该值设置为表达式,该表达式应为:

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

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

在本主题的其他部分,这里有一些关于此主题的经验教训

设置参数选择“多个值”复选框:

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)

您将需要一个split函数将它们放入表中`插入@pEmails EmailAddress从fn中选择*_split@ReportParameter1谢谢你!这就是我需要的指针!还是有问题。当我对参数使用“允许多个值”复选框时,如果我输入的值为:val1 val2 val3,它会在参数字段中显示为val1,val2,val3,但是分割函数不起作用,它说它有太多的参数。如果我只输入val1,或者在一行上输入val1、val2、val3,它就可以工作。我不知道什么格式的出价是通过每行一个多值。谢谢!更准确地说,这里是需要的元素:1 splitstring函数添加了2主查询:DECLARE@pEmails TABLE EmailAddress varchar255;插入@pEmails EmailAddress SELECT*FROM dbo。splitstring@pEmailString; 从@pEmails 3中选择EmailAddress内部参数:@pEmailString==JoinParameters!pEmailList.Value,4外部用户输入的参数:@pEmailList,text,允许多个值非常有效。谢谢