如何将一个变量中的一个参数中的多个值传递给SSIS的OLEDB源
我试图将多个值作为一个参数传递。 例如:我需要在(1,2,3,4,5)中获取employeeID
, employeeID
字段数据类型是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