查找DISTINCT缺少SQL依赖项

时间:2016-07-28 09:48:35

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

我有脚本,它返回数据库中所有无效的依赖项。但是这个脚本会返回许多重复项。所以我想只看到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]但是我收到以下错误:

  

无效的列名称'...取决于此缺少的实体名称'。

我尝试在结果中为每个列添加聚合函数,仅用于测试,但仍然是相同的错误。

2 个答案:

答案 0 :(得分:4)

def test(i=4): print(i) 实际字段名称不是别名。

GROUP BY

答案 1 :(得分:1)

您可以使用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
;