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

Getting database names, usernames via query for multi database instance/database server(s) - results showing in separate tables,

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

这是我的查询:

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,
       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 etc
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;

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

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

你能帮我解决这个问题吗?

由于你想对每个数据库执行此操作,我将使用一些(无耻的)自我提升,并使用我创建的名为 sp_foreachdatabaseA CURSOR free version of sp_msforeachdb 的过程。 一个内置过程,它做类似的事情,但是,它没有记录,有时行为不端。它还使用游标,许多使用过 SQL 服务器的人都知道要尽可能避免使用游标。

创建以上内容后,我会稍微更改您的查询以将服务器和数据库放入列中,然后使用 Pre 和 Post 命令参数将 CREATESELECT 从临时table 我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,
       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;',
       @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;