2016-07-28 8 views
3

Ich habe Skript, das alle ungültigen Abhängigkeiten in der Datenbank zurückgibt. Aber dieses Skript gibt viele Duplikate zurück. Also ich möchte nur DISTINCT Ergebnisse sehen.Suchen DISTINCT fehlende SQL-Abhängigkeiten

/* 
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 

Dies ist Skript.

Ich versuchte GROUP BY [... depends ON this missing entity name] hinzufügen, aber ich bekomme die folgende Fehlermeldung:

Invalid column name '... depends ON this missing entity name'.

Ich habe versucht, nur für Test in Folge zu jeder Spalte Aggregatfunktionen hinzufügen, aber immer noch gleiche Fehler.

+0

SELECT DISTINCT' oder 'GROUP BY ISNULL (QUOTENAME (referenced_server_name) + '', '') + ISNULL (QUOTENAME (referenced_database_name) + '.', '') + ISNULL (Zitatname (referenzierter_Schema_Name) + '.', '') + Zitatname (referenzierter_Entitätsname) ' – Matt

+0

@Matt, ja,' GROUP BY' hilft. Denken Sie immer daran, GROUP BY by Alias ​​sollte funktionieren ... – demo

+0

Hat die 'GROUP BY' funktioniert? – Matt

Antwort

4

GROUP BY die tatsächlichen Feldnamen nicht das Alias.

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 
1

Sie können einen APPLY-Operator verwenden, um auf Aliase früher in der Abfrage zuzugreifen, z. (Suchen Sie nach 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 
;