Sql server 使用sp_MSforeachdb和如何在ASC中排序DBName排除空白记录

Sql server 使用sp_MSforeachdb和如何在ASC中排序DBName排除空白记录,sql-server,tsql,Sql Server,Tsql,我在SQLServer2008R2中工作 我需要找到在我工作的服务器中的数据库中定义了SQL Server(DBSQLSERVER)的位置。我能够在另一个网站上找到一篇老帖子来做这件事,但是有几个问题需要解决 SET NOCOUNT ON; DECLARE @text NVARCHAR(128) DECLARE @sql NVARCHAR(MAX) SET @text = @@SERVERNAME; SET @sql = 'USE [?] SELECT ''?'' [DBNam

我在SQLServer2008R2中工作

我需要找到在我工作的服务器中的数据库中定义了SQL Server(DBSQLSERVER)的位置。我能够在另一个网站上找到一篇老帖子来做这件事,但是有几个问题需要解决

SET NOCOUNT ON;
DECLARE @text NVARCHAR(128)
DECLARE @sql NVARCHAR(MAX)
SET @text = @@SERVERNAME;
SET @sql = 
    'USE [?]
    SELECT ''?'' [DBName], @@SERVERNAME AS [Server], o.name AS [ObjName], o.type_desc [TypeDesc]
    FROM sys.sql_modules m 
    INNER JOIN sys.objects o 
    ON m.object_id = o.object_id
    WHERE m.definition Like ' + CHAR(39) + '%' + @text + '%' + CHAR(39) + '
    ORDER BY 1, 3 asc'
EXEC sp_MSforeachdb @sql;
我有两个问题:

  • 我得到了一些空白记录,不知道我从哪里得到的。这些是从哪里来的,以及如何从我的记录中排除它们将不胜感激

  • 在这个SQL语句中,我试图创建一个ORDERBY语句,但它不起作用。我有一个我无法定义的零星顺序。我如何将它们按DBNAME的顺序排列,然后再按ObjName的顺序排列

  • 订单问题请参见图片

    在这两个问题上的任何帮助/指导都将不胜感激


    谢谢

    空结果集来自没有与where谓词匹配的对象的数据库。至于排序,您必须记住,您正在使用此处的光标滚动每个数据库。这不是你能控制的。但是,在查询中,您有一个order by。我强烈建议您按列名而不是顺序排列。它的用法已被弃用,从多个角度使用它很有挑战性。
    sp_MSforeachdb
    不返回单个记录集。它为每个数据库返回一个记录集。因为空记录集是有效的记录集,所以不返回结果的数据库仍然显示“空白”记录。这也回答了为什么您的结果不有序。它们是在每个记录集中订购的。嘿,伙计们,谢谢你们的回复。培根片-谢谢你的清晰和简洁的解释,因为这真的很有帮助。有没有办法防止显示空记录集?再次感谢。你不能只隐藏空的结果集。想想这里发生了什么。您正在对每个数据库执行查询。即使没有行,该查询也将执行并成为结果集。您可以创建一个临时表来保存每次选择的结果,并将动态sql插入到该临时表中。这样,当没有行要返回时,就不会有行了。谢谢肖恩。感谢您的回复和解释。