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

SSIS - OLEDB Source - how to use sql query with variables?

我有这个查询,我想将其内容导出到 table:

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 table.

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

如有任何帮助,我们将不胜感激。

谢谢

添加一个dataflow task,在里面添加一个Oledb source和一个Oledb destination

添加一个字符串类型的变量,将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

阅读您的评论后 “...此 foreach 循环将查询 sys.databases 以获取所有用户数据库,并且应该迭代该变量以获取权限”。 =68=].

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

SELECT name from sys.databases

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

的变量

Link 执行 SQL 任务到 ForEach Loop Container

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

另外不要忘记将 Dataflow 任务 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')