T-SQL - 尝试在我的服务器上查询所有数据库中的内容

时间:2016-01-28 16:59:56

标签: tsql sql-server-2014

我的环境中我的服务器托管了可变数量的数据库,所有这些数据库都使用相同的表结构/模式。我需要提取满足一系列约束的客户总数,例如用户表。我还需要显示我显示总和的数据库。

我已经知道我需要通过db查询获取数据库中的总和,但我真正想做的是有一个脚本可以访问我服务器上当前所有非系统数据库这个信息。

请原谅我对此的无知。

更新 - 所以,要稍微澄清一下;我正在使用MS SQL 2014.我知道如何通过使用来获取我想要命中的dbs列表:

SELECT  name
FROM    sys.databases
WHERE   name not in ('master', 'model', 'msdb', 'tempdb')
AND state = 0

为了收集每个人需要的数据,我们只是说我有类似的东西:

select count(u.userid)
from users n
join UserAttributes ua on u.userid = ua.userid
where ua.status = 2

新更新: 所以,我继续按照@Philip Kelley的建议添加了ps sp_foreachdb,我现在遇到了一个问题,试图运行它(不可否认,我可以告诉我更接近解决方案)。所以,这就是我用来调用sp:

USE [master]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[sp_foreachdb]
        @command = N'select count(userid) as number from ?..users',
        @print_dbname = 1,
        @user_only = 1

SELECT  'Return Value' = @return_value

GO

这提供了一个漂亮而干净的输出显示计数,但我想看到的除了计数之外还有db名称,如下所示:

| [DB_NAME] | [COUNT] |

但对于每个数据库

这甚至可能吗?

3 个答案:

答案 0 :(得分:1)

从schema / sysdatabases枚举数据库。至少在没有复制的情况下,不包括db_ids 1到4,因为系统数据库应该相当健壮:

SELECT [name] FROM master.dbo.sysdatabases WHERE dbid NOT IN (1,2,3,4)

存在其他方法,请参见此处:Get list of databases from SQL Server和此处:SQL Server: How to tell if a database is a system database?

然后使用数据库名称为查询或存储过程调用添加前缀,并在第一个查询的结果集上的游标循环中,将其存储在sysname变量中以构造一系列语句:

SELECT column FROM databasename.schema.Viewname WHERE ...

并使用字符串execute function

调用它
EXECUTE('SELECT ... FROM '+@@fully_qualified_table_name+' WHERE ...')

答案 1 :(得分:1)

源代码: https://codereview.stackexchange.com/questions/113063/executing-dynamic-sql-programmatically

示例用法:

declare @options int = (
    select a.ExcludeSystemDatabases
    from dbo.ForEachDatabaseOptions() as a
);

execute dbo.usp_ForEachDatabase
    @Command = N'print Db_Name();'
  , @Options = @options;

@Command可以是您想要的任何内容,但显然它需要是每个数据库都能理解的查询。 @Options目前有3个内置设置,但您可以根据需要进行扩展。

我写这篇文章是为了模仿/扩展master.sys.sp_MSforeachdb程序,但它仍然可以使用一点点修饰(特别是围绕"逻辑"用当前替换?数据库名称)。

答案 2 :(得分:0)

在master数据库中找到了未记录的sytem过程sp_msForEachDB。互联网上的许多专家建议不要使用它,因为在不明显的边缘情况下它可能是不可靠的并且以某种方式跳过随机数据库。把我算作其中之一,几个月前这让我感到非常悲痛。

您可以编写自己的例程来提供此类功能。然而,这是一项常见的任务,许多人已经完成了这项工作并在线发布了代码......那么为什么要重新发明轮子?

@ kittoes0124发布了一个指向“usp_ForEachDatabse”的链接。这可能有效,但是我讨厌任何与usp_一起生存的存储过程。我最终得到了Aaron Bertrand的实用程序,可以在http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/找到。

安装此例程的一个版本,弄清楚它是如何工作的,插入脚本然后去!