如何将一个变量中的一个参数中的多个值传递给SSIS的OLEDB源

我试图将多个值作为一个参数传递。 例如:我需要在(1,2,3,4,5)中获取employeeIDemployeeID字段数据类型是Integer。

查询:

 select * from emp where employeeID = ? 

我创建一个值为1的变量'v_employeeID'并传递OLEDB Source中的参数映射。 我可以传递一个值,但我不能传递多个值。

一个简单的解决方案是使整个查询成为变量。 如果你的@employeeID变量包含“1,2,3”(顺便说一下它必须是一个字符串变量),那么你的@SQLQuery变量将是:

 "select * from emp where employeeID IN (" + @employeeID +")" 

然后在OLEDB源中,使用“从变量查询”选项,并使用@SQLQuery变量作为源。

一种解决方法是创建一个函数:

 CREATE FUNCTION [dbo].[fn_GenerateIDs] ( @psCSString VARCHAR(8000) ) RETURNS @otTemp TABLE(sID VARCHAR(20)) AS BEGIN DECLARE @sTemp VARCHAR(10) WHILE LEN(@psCSString) > 0 BEGIN SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1), LEN(@psCSString))) SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0), LEN(@psCSString)) + 1, LEN(@psCSString)) INSERT INTO @otTemp VALUES (@sTemp) END RETURN END 

当格式传递时,会返回ID表: '1,2,3,4'

如 :

 select * from fn_GenerateIDs('1,2,3') 

结果:

 +----+ | ID | +----+ | 1 | +----+ | 2 | +----+ | 3 | +----+ 

然后你必须以varchar格式传递参数:“1,2,3,4,5”并将它与Employee表进行比较:

  select * from emp where EXISTS ( select 1 from fn_GenerateIDs('1,2,3') where employeeID = sID) 

如果您使用SQL Server 2016,另一个选项是使用新添加的函数STRING_SPLIT

这需要2个参数:ID字符串和分隔符

如:

 select * from dbo.emp inner join string_split('1,2,3,4',',') on dbo.emp.employeeID = value