【问题标题】:Find DISTINCT Missing SQL Dependencies查找 DISTINCT 缺失的 SQL 依赖项
【发布时间】:2016-12-02 15:15:24
【问题描述】:

我有返回数据库中所有无效依赖项的脚本。但是此脚本返回许多重复项。所以我只想看到DISTINCT 结果。

    /*
modified version of script from http://michaeljswart.com/2009/12/find-missing-sql-dependencies/
Added columns for object types & generated refresh module command...
filter out user-define types: http://stackoverflow.com/questions/2330521/find-broken-objects-in-sql-server
*/

SELECT TOP (100) PERCENT
    QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS [this Object...],
        o.type_desc,
    ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name) AS [... depends ON this missing entity name]
    ,sed.referenced_class_desc
    ,case when o.type_desc in( 'SQL_STORED_PROCEDURE' ,'SQL_SCALAR_FUNCTION' ,'SQL_TRIGGER' ,'VIEW')
          then 'EXEC sys.sp_refreshsqlmodule ''' + QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) + ''';'
          else null
       end as [Refresh SQL Module command]
FROM sys.sql_expression_dependencies as sed
LEFT JOIN sys.objects o
            ON sed.referencing_id=o.object_id
WHERE (is_ambiguous = 0)
    AND (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name)) IS NULL)
    AND NOT EXISTS
       (SELECT * 
        FROM sys.types 
        WHERE types.name = referenced_entity_name 
        AND types.schema_id = ISNULL(SCHEMA_ID(referenced_schema_name), SCHEMA_ID('dbo'))
       )
ORDER BY [this Object...],
[... depends ON this missing entity name]
go

这是脚本。

我尝试添加GROUP BY [... depends ON this missing entity name],但出现以下错误:

无效的列名'...取决于这个缺失的实体名'。

我尝试将聚合函数添加到结果中的每一列仅用于测试,但仍然出现相同的错误。

【问题讨论】:

  • SELECT DISTINCT 或 GROUP BY ISNULL(QuoteName(referenced_server_name) + '.', '') + ISNULL(QuoteName(referenced_database_name) + '.', '') + ISNULL(QuoteName(referenced_schema_name) + '.', '') + QuoteName(referenced_entity_name)
  • @Matt,是的,GROUP BY 有帮助。总是认为 GROUP BY by alias 应该可以工作......
  • GROUP BY 工作了吗?
  • @Matt,好像是的。不再显示错误
  • 抱歉,您不能在 group by 子句中使用别名。这是The Logical Processing Order 的结果。

标签: sql sql-server sql-server-2012 group-by


【解决方案1】:

GROUP BY 实际字段名不是别名。

SELECT TOP (100) PERCENT
    QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS [this Object...],
        o.type_desc,
    ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name) AS [... depends ON this missing entity name]
    ,sed.referenced_class_desc
    ,case when o.type_desc in( 'SQL_STORED_PROCEDURE' ,'SQL_SCALAR_FUNCTION' ,'SQL_TRIGGER' ,'VIEW')
          then 'EXEC sys.sp_refreshsqlmodule ''' + QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) + ''';'
          else null
       end as [Refresh SQL Module command]
FROM sys.sql_expression_dependencies as sed
LEFT JOIN sys.objects o
            ON sed.referencing_id=o.object_id
WHERE (is_ambiguous = 0)
    AND (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name)) IS NULL)
    AND NOT EXISTS
       (SELECT * 
        FROM sys.types 
        WHERE types.name = referenced_entity_name 
        AND types.schema_id = ISNULL(SCHEMA_ID(referenced_schema_name), SCHEMA_ID('dbo'))
       )
GROUP BY ISNULL(QuoteName(referenced_server_name) + '.', '') + ISNULL(QuoteName(referenced_database_name) + '.', '') + ISNULL(QuoteName(referenced_schema_name) + '.', '') + QuoteName(referenced_entity_name)
ORDER BY [this Object...],
[... depends ON this missing entity name]
go

【讨论】:

    【解决方案2】:

    您可以在查询的前面使用 APPLY 运算符来访问别名,例如(寻找oa.x oa.y oa.z)

    SELECT
            o.type_desc, sed.referenced_class_desc
          , oa.x , oa.y , oa.z
    FROM sys.sql_expression_dependencies AS sed
      LEFT JOIN sys.objects o ON sed.referencing_id = o.object_id
      OUTER APPLY (
          SELECT
                  ISNULL(QUOTENAME(sed.referenced_server_name) + '.', '')
                + ISNULL(QUOTENAME(sed.referenced_database_name) + '.', '')
                + ISNULL(QUOTENAME(sed.referenced_schema_name) + '.', '')
                + QUOTENAME(sed.referenced_entity_name)                    AS x
              ,  QUOTENAME(OBJECT_SCHEMA_NAME(referencing_id)) 
                + '.' 
                + QUOTENAME(OBJECT_NAME(referencing_id))                   AS y
              , CASE
                      WHEN o.type_desc IN ('SQL_STORED_PROCEDURE', 'SQL_SCALAR_FUNCTION', 'SQL_TRIGGER', 'VIEW') 
                        THEN 'EXEC sys.sp_refreshsqlmodule ''' 
                          + QUOTENAME(OBJECT_SCHEMA_NAME(referencing_id)) 
                          + '.' + QUOTENAME(OBJECT_NAME(referencing_id)) 
                          + ''';'
                      ELSE NULL
                END                                                        AS z
          ) AS OA
    WHERE (is_ambiguous = 0)
          AND (oa.x IS NULL)
          AND NOT EXISTS (
                SELECT
                      *
                FROM sys.types
                WHERE types.name = referenced_entity_name
                      AND types.schema_id = ISNULL(SCHEMA_ID(referenced_schema_name), SCHEMA_ID('dbo'))
                )
    GROUP BY
            o.type_desc, sed.referenced_class_desc
          , oa.x , oa.y , oa.z
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2011-02-12
      • 2012-10-21
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多