通过查询多数据库实例/数据库服务器获取数据库名称,用户名-结果显示在单独的表中,

问题描述

我有一个小问题,我没有找到解决方案。我正在对数据库实例名称数据库名称和该数据库中的用户运行组合查询

这是我的查询

SELECT @@SERVERNAME AS 'Server Name'

use db1
SELECT DB_NAME() AS [Current Database];  
 
select name as username,create_date,modify_date,type_desc       
from sys.database_principals
where type not in ('A','G','R','X')
      and sid is not null
      and name != 'guest'
order by username;

SELECT @@SERVERNAME AS 'Server Name'


use db2
SELECT DB_NAME() AS [Current Database];  
 
select name as username,'X')
      and sid is not null
      and name != 'guest'
order by username;

SELECT @@SERVERNAME AS 'Server Name'


use etc
SELECT DB_NAME() AS [Current Database];  
 
select name as username,'X')
      and sid is not null
      and name != 'guest'
order by username;

输出的问题是即使正确也不能使用。 (我正在尝试将其手动复制粘贴到文本文件中。)

我的目标是将该查询输出转换为CSV或其他文件类型。

您能帮我吗?

解决方法

由于yu希望针对每个数据库执行此操作,因此我将使用一些(无耻的)自我升级,并使用我创建的名为sp_foreachdatabaseA CURSOR free version of sp_msforeachdb的过程。有一个内置的程序可以执行类似的操作,但是它没有文档记录,有时行为不当。它还使用游标,SQL Server的许多经验丰富者都知道游标会尽量避免。

创建上面的内容后,我将稍作更改以将服务器和数据库放入列中,然后使用Pre和Post Command参数将CREATESELECT从临时目录表I INSERT存入数据。

在创建对象之后,将给出以下语句:

USE master;
GO

DECLARE @Command nvarchar(MAX) = N'INSERT INTO #Users (servername,databasename,username,create_date,modify_date,type_desc)
SELECT @@SERVERNAME AS servername,& as databasename,[name] as username,type_desc       
FROM sys.database_principals
WHERE type NOT IN (''A'',''G'',''R'',''X'')
  AND sid IS NOT NULL
  AND name != ''guest''
ORDER BY username;',@Pre_Command nvarchar(MAX) = N'CREATE TABLE #Users (servername sysname,databasename sysname,username sysname,create_date datetime,modify_date datetime,type_desc nvarchar(60));',@Post_Command nvarchar(MAX) = N'SELECT * FROM #Users;',@Command_Run nvarchar(MAX);

EXEC sp_foreachdatabase @Command = @Command,@Skip_System = 1,@Auto_Use = 1,@Pre_Command = @Pre_Command,@Post_Command = @Post_Command,@Command_Run = @Command_Run OUTPUT;
--PRINT @Command_Run;
--SELECT @Command_Run;