通过查询多数据库 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_foreachdatabase
:A CURSOR free version of sp_msforeachdb 的过程。 是 一个内置过程,它做类似的事情,但是,它没有记录,有时行为不端。它还使用游标,许多使用过 SQL 服务器的人都知道要尽可能避免使用游标。
创建以上内容后,我会稍微更改您的查询以将服务器和数据库放入列中,然后使用 Pre 和 Post 命令参数将 CREATE
和 SELECT
从临时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;
我有一个小问题,我没有看到解决方案。我是 运行 数据库实例名称、数据库名称和该数据库中的用户的组合查询。
这是我的查询:
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_foreachdatabase
:A CURSOR free version of sp_msforeachdb 的过程。 是 一个内置过程,它做类似的事情,但是,它没有记录,有时行为不端。它还使用游标,许多使用过 SQL 服务器的人都知道要尽可能避免使用游标。
创建以上内容后,我会稍微更改您的查询以将服务器和数据库放入列中,然后使用 Pre 和 Post 命令参数将 CREATE
和 SELECT
从临时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;