子句

时间:2018-01-24 22:26:52

标签: sql-server ssis

我试图看看是否有一个简单的答案。我在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

这个看起来也不错 https://sqlblogcasts.com/blogs/simons/archive/2007/11/22/RS-HowTo---Pass-a-multivalue-parameter-to-a-query-using-IN.aspx

到目前为止,我会继续研究并感谢你的帮助。

我认为这总结得最好

  

此功能仅限于严格使用嵌入式SQL。

     

SSRS的作用是将您的SQL列IN(@value)转换为列IN   (@ selectedvalue1,@ selectedvalue2)等。

     

你需要忘记关于其他传球方式的任何事情   列出SQL,即构建字符串等,并确保声明   数据类型对于参数的值是正确的。

     

你不需要使用Join(参数!,“,”)技巧,除非   您正在将列表传递给存储过程。

     

在这种情况下,您需要使用某个函数来转换分隔符   像你一样列入行集。

     

我希望有帮助

核心问题是我是否可以在SSIS中获得与SSRS相同的功能。它让我想起宏观替代......

1 个答案:

答案 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) 
                    )