从VS报告将String传递给@Parameter

时间:2014-06-03 09:19:17

标签: sql sql-server visual-studio parameters table-valued-parameters

我确实问了一个关于这个的问题,但仍然无法弄清楚如何使这个工作,我看了一些例子,人们使用函数,表变量,创建类型,不能真正得到任何工作,所以想知道是否有人可以帮助和如果它复杂的话,可能会解释一下他们编写的代码。

我使用Visual Studio 2012创建报告,并在报告中列出一个下拉列表,其中填写了公司名称,用户可以勾选这些名称以查看有关每家公司的信息。

我想要做的是从此下拉列表中获取所有公司ID,并将其传递到我的sql where语句中的In子句中。这是我所获得的简化版本,我是新手,所以只是试着看看在将来我需要考虑更复杂的东西时有什么用。

理想情况下,我已经注释掉的行将是应该使用的行和传递给它的值,但是我添加了我用于测试的等效行,我在1之间的逗号上得到一个错误, 2和

error message syntax error near ','.

如果有人可以帮助我们使用@companynameParam来解决这个问题,那么我已经注意到这将是很好的。 CompanyNameParam是VS报告中下拉列表的名称。

Declare @ContactID int

--set @ContactID = @CompanyNameParam
set @ContactID = 1,2,3,4,5,6,7,8,9


select CompanyName as 'reportcompanyname'
from company co inner join contacts c on c.CompanyID = co.CompanyID
where ContactID in (@ContactID);

1 个答案:

答案 0 :(得分:0)

您收到错误,因为SET命令用于一次将single / scalar值分配给单个变量,并且您尝试将multiple comma separated string值分配给single integer variable } @ContactID一气呵成。

正确的做法是首先声明local variable类型varchar而非Int为 @CompanyNameParam必须是一个字符串。

Declare @ContactID varchar(500);

然后将逗号分隔的字符串转换为表格。 [有很多方法可以做到这一点]我只是举个例子。创建用户定义的函数:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[CSVToTable] (@InStr VARCHAR(MAX))
RETURNS @TempTab TABLE
   (id int not null)
AS
BEGIN
        SET @InStr = REPLACE(@InStr + ',', ',,', ',')
    DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @INSTR ) <> 0 
BEGIN
   SELECT  @SP = PATINDEX('%,%',@INSTR)
   SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
   SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
   INSERT INTO @TempTab(id) VALUES (@VALUE)
END
    RETURN
END
GO

完成后,您可以重新编写sproc:

select CompanyName as 'reportcompanyname'
from company co inner join contacts c on c.CompanyID = co.CompanyID
where ContactID in (SELECT * FROM dbo.CSVToTable(@CompanyNameParam));

在这里查看DEMO ..