SSIS - OLEDB源 - 如何使用变量的SQL查询?

时间:2017-05-13 22:06:14

标签: sql sql-server ssis etl

我有这个查询要将其内容导出到表中:

DECLARE @bdname VARCHAR(50)
SET @bdname = ?

SELECT 
    @bdname, 
    CONVERT(CHAR(30), dp2.name), 
    CONVERT(CHAR(20), dp.name) 
FROM  
    sys.database_principals AS dp 
INNER JOIN
    sys.database_role_members AS drm ON dp.principal_id = drm.role_principal_id 
INNER JOIN
    sys.database_principals AS dp2 ON drm.member_principal_id = dp2.principal_id
WHERE  
    (dp2.principal_id > 4) AND (dp2.type <> 'R')

如果我把它作为执行SQL任务的一部分,它就可以了,但我不能(不知道怎么做)然后将结果映射到我可以导出到SQL表的内容。

任何人都可以指导我如何将此查询的结果放入表中?这是因为如果我使用dataflow和ole db source,它就不接受这种类型的查询。

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

在其中添加dataflow task,添加Oledb sourceOledb destination

添加string类型的变量,将Evaluate as expression设置为true并指定以下表达式:

"SELECT '" + @[User::bdname] + "' , convert(char(30),dp2.name), convert(char(20),dp.name) 
FROM  sys.database_principals AS dp INNER JOIN
sys.database_role_members AS drm ON dp.principal_id = drm.role_principal_id 
INNER JoIN
sys.database_principals AS dp2 ON  drm.member_principal_id = dp2.principal_id
WHERE  (dp2.principal_id > 4) AND (dp2.type <> 'R')"

(假设bdname值存储在user::bdname变量中)

Oledb source中将源类型设置为Sql command from variable并选择创建的变量

oledb source映射到oledb destination

更新1

阅读你的评论&#34; ...这个foreach循环将查询sys.databases所有用户数据库,它应该迭代该变量,以获得权限&#34;

要遍历数据库,您必须添加带有SQL命令的Execute SQL Task

SELECT name from sys.databases

并将结果集设置为Full Result Set,并将结果集分配给Object

类型的变量

将此执行SQL任务链接到ForEach Loop Container

在foreach循环容器中将枚举器类型更改为Ado enumerator并选择对象变量作为源

enter image description here enter image description here

另外,不要忘记将数据流任务Delay Validation属性设置为True

更新2(解决方法)

尝试使用sys.databases加入您的查询,而不是使用Foreach loop container (我不知道它是否达到您想要的效果)

SELECT db.name, convert(char(30),dp2.name), convert(char(20),dp.name) 
FROM  sys.database_principals AS dp INNER JOIN
sys.database_role_members AS drm ON dp.principal_id = drm.role_principal_id 
INNER JoIN
sys.database_principals AS dp2 ON drm.member_principal_id = dp2.principal_id
INNER JOIN sys.databases as db ON db.owner_sid = dp2.sid
WHERE  (dp2.principal_id > 4) AND (dp2.type <> 'R')