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