SSIS-OLEDB源代码-如何使用带变量的sql查询?

SSIS-OLEDB源代码-如何使用带变量的sql查询?,sql,sql-server,ssis,etl,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.pr

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

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')
DECLARE@bdname VARCHAR(50)
设置@bdname=?
挑选
@bdname,
转换(字符(30),dp2.name),
转换(字符(20),dp.name)
从…起
sys.database_主体作为dp
内连接
sys.database_role_成员作为dp.principal_id=drm.role_principal_id上的drm
内连接
sys.database_principals作为drm.member_principal_id=dp2.principal_id上的dp2
哪里
(dp2.principal_id>4)和(dp2.type'R')
如果我将其作为执行SQL任务的一部分,它会正常运行,但我无法(不知道如何)将结果映射到可以导出到SQL表的内容中

有人能告诉我如何将查询结果放入表中吗?这是因为如果我使用dataflow和ole db source,它不接受这种类型的查询

任何帮助都将不胜感激


谢谢

添加一个
数据流任务
,在其中添加一个
Oledb源
和一个
Oledb目标

添加一个字符串类型的变量,将
计算为表达式设置为
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')"
并将结果集设置为
完整结果集
,并将结果集分配给
对象类型的变量

将此执行SQL任务链接到
ForEach循环容器

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

另外,不要忘记将数据流任务
延迟验证
属性设置为
True

更新2(解决方案)

尝试使用
sys.databases
连接您的查询,而不是使用
Foreach循环容器
(我不知道它是否达到了您想要的效果)

选择db.name、convert(char(30)、dp2.name)、convert(char(20)、dp.name)
从sys.database_主体作为dp内部联接
sys.database_role_成员作为dp.principal_id=drm.role_principal_id上的drm
内连接
sys.database_principals作为drm.member_principal_id=dp2.principal_id上的dp2
将sys.databases作为db.owner_sid=dp2.sid上的db进行内部连接
其中(dp2.principal_id>4)和(dp2.type'R')

它不接受我在开头使用变量。。。已经这么做了:/@Filburt,我该怎么做?实际上,我遵循了一个教程,尝试使用from变量,但它不起作用。也许我做错了。谢谢试图实现它。我必须将该var转换为user:bdname,但当我尝试这样做时,它说不支持它。可能是因为它是一个对象,因为该变量包含一个数据库列表。我不明白,您使用的是
declare@bdname varchar(50)
它是如何属于object类型的?好的,哈迪,我已经设法使用了您提供的解决方案,但没有完全使用。我仍然不知道是否要将数据库名称的多个值分配给该变量,因为这段代码是Foreach循环容器的一部分。这个foreach循环将查询sys.databases中的所有用户数据库,并且应该迭代该变量以获得权限。
SELECT name from sys.databases
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')