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')
我有这个查询,我想将其内容导出到 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')