假设您使用的是 SQL 2005 或更高版本,并且不带参数执行sp_helprolemember,这是sp_helprolemember 运行的查询(使用sp_helptext 提取):
select DbRole = g.name, MemberName = u.name, MemberSID = u.sid
from sys.database_principals u, sys.database_principals g, sys.database_role_members m
where g.principal_id = m.role_principal_id
and u.principal_id = m.member_principal_id
order by 1, 2
这应该使您能够将所需的信息收集到临时表中。
如果您更愿意坚持记录在案的行为,可以将 SP 的输出存储到临时表中:
create table #t
(DbRole sysname,
MemberName sysname,
MemberSID varbinary(85)
)
insert #t
exec sp_helprolemember
select * from #t
编辑
有两种方法可以使用这些数据来修改您的系统。一种是使用游标:
DECLARE @memberName sysname
DECLARE curMember CURSOR fast_forward FOR
SELECT MemberName
FROM #t
WHERE MemberName LIKE 'Domain\%'
OPEN curMember
FETCH NEXT FROM curMember INTO @memberName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_addrolemember 'OldRole', @memberName
FETCH NEXT FROM curMember INTO @memberName
END
CLOSE curMember
DEALLOCATE curMember
另一个是使用动态SQL:
DECLARE @sql NVARCHAR(MAX),
SELECT @sql = 'EXEC sp_addrolemember ''OldRole'', ''' + MemberName + ''''
FROM #t
WHERE MemberName LIKE 'Domain\%'
EXEC sp_executesql @stmt = @sql
如您所见,动态 SQL 版本更紧凑,但需要更多的维护工作。
请记住,在执行任一语句后,您从 sp_helprolemember 提取到表中的数据不再是最新的,可能应该刷新。