我试图看看是否有一个简单的答案。我在SSRS中使用多个选择下拉参数做了类似的事情,但这似乎有所不同。
我的情况是这样,所以也许有更好的答案。
我有一个生产服务器,我不想对包含临时表或函数进行任何更改。生产服务器有一个包含大约1600条记录的客户表。我已经设置了一个SSIS包,允许基于clientid将数据从生产转移到dev。所以我的来源会有类似于从表中选择字段的查询,其中ClientId =?
这很好用。现在我想根据clients表中的数据加载多个客户端。它可能是从客户端选择ClientId,其中Field = A并返回多个ClientIds。
我能够将执行sql任务中的逗号分隔列表填充到SSIS变量中,因此它可能是1,4,8。
如果我将源查询更改为在(?)中使用ClientId,则会出现转换错误。
我查看了许多提倡临时表或我想避免的功能的帖子。 Select IN using varchar string with comma delimited values
我已经考虑将整个sql语句构建到一个变量中,但这似乎不是正确的路径,因为我有很多表来查询和传输使用ClientId =?在不必将每个单独的SQL语句构建到变量的情况下运行良好。
我缺少一个简单的修复方法吗?我现在转向我的研究,试图找出我是如何在SSRS中做到这一点的,但我认为我应该在这里试一试,看看有人之前是否已经完成了这项工作。
我感谢您的任何信息,谢谢。
编辑:关键是客户端上的列位于开发服务器上,因此我不能只在where子句中使用select,因为生产服务器上不存在该列。
编辑:我没有提到我是专门查看将参数映射到的OLEDB源?在sql语句中。编辑:缩小范围,但无法解决SSRS和SSIS功能问题。在SSRS中,它在以下链接中称为多值参数,关键行是
WHERE Production.ProductInventory.ProductID IN(@ProductID)
https://msdn.microsoft.com/en-us/library/dn385719(v=sql.110).aspx
到目前为止,我会继续研究并感谢你的帮助。
我认为这总结得最好
此功能仅限于严格使用嵌入式SQL。
SSRS的作用是将您的SQL列IN(@value)转换为列IN (@ selectedvalue1,@ selectedvalue2)等。
你需要忘记关于其他传球方式的任何事情 列出SQL,即构建字符串等,并确保声明 数据类型对于参数的值是正确的。
你不需要使用Join(参数!,“,”)技巧,除非 您正在将列表传递给存储过程。
在这种情况下,您需要使用某个函数来转换分隔符 像你一样列入行集。
我希望有帮助
核心问题是我是否可以在SSIS中获得与SSRS相同的功能。它让我想起宏观替代......
答案 0 :(得分:0)
如果您不想创建函数,可以在t-sql语句中使用以下内容。
Declare @ClientIds nvarchar(50) = '123,456'; --<-- Comma delimited list of Client Ids
Select Field
From Table
Where ClientId IN (
SELECT CAST(RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS INT) ClientIDs
FROM (
SELECT Cast ('<X>'
+ Replace(@ClientIds, ',', '</X><X>')
+ '</X>' AS XML) AS Data
) AS t CROSS APPLY Data.nodes ('/X') AS Split(a)
)