我有这个查询要将其内容导出到表中:
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,它就不接受这种类型的查询。
非常感谢任何帮助。
由于
答案 0 :(得分:2)
在其中添加dataflow task
,添加Oledb source
和Oledb 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
并选择对象变量作为源
另外,不要忘记将数据流任务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')