0

次のクエリは、2 つのデータベース間で主キーを比較します。1 つのデータベースのすべての主キー制約を識別しますが、他のデータベースは識別しません。クエリを実行すると、一部の制約名がシステム生成 (PK__afm_scmpref__2D27B809またはPK__projfund__E34271EE251CF998) のように見えます。これらはシステム生成であるため、データベース間で比較することはできません。この問題を回避する方法はありますか?

どうもありがとう、

これが私のコードです:

SELECT src.table_name AS src_table,
   src.constraint_name AS scr_constraint_name,
   src.column_name AS src_column_name,
   src.ordinal_position AS src_ordinal_position,
   tgt.table_name AS tgt_table_name ,
   tgt.constraint_name AS tgt_constraint_name,
   tgt.column_name AS tgt_column_name,
   tgt.ordinal_position AS tgt_ordinal_position
from db_comp_src_primary_keys src
   FULL OUTER JOIN
db_comp_tgt_primary_keys tgt ON
    src.table_name = tgt.table_name
    AND src.constraint_name = tgt.constraint_name

 WHERE (   (src.constraint_name IS NULL AND tgt.constraint_name IS NOT NULL)
    OR (src.constraint_name IS NOT NULL AND tgt.constraint_name IS NULL))
 AND (   (           tgt.table_name IS NULL
            AND src.table_name IS NOT NULL
            AND src.constraint_name IS NOT NULL
            AND src.table_name IN
                   (SELECT table_name
                      FROM [HQ-193-STOCK-DBO].INFORMATION_SCHEMA.tables))
        OR (    src.table_name IS NULL
            AND tgt.table_name IS NOT NULL
            AND tgt.constraint_name IS NOT NULL
            AND tgt.table_name IN
                   (SELECT table_name
                      FROM [HQ-211-STOCK-DBO].INFORMATION_SCHEMA.tables)))
4

1 に答える 1

0

1つの主キーのすべての列が他の主キーと同じであるかどうかをチェックするこのようなものはどうですか

SELECT DISTINCT
    QUOTENAME(t1.CONSTRAINT_CATALOG) + '.' + QUOTENAME(t1.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(t1.CONSTRAINT_NAME) [Source],
    QUOTENAME(t2.CONSTRAINT_CATALOG) + '.' + QUOTENAME(t2.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(t2.CONSTRAINT_NAME) [Target],
    CASE WHEN t1.CONSTRAINT_NAME  IS NULL OR t2.CONSTRAINT_NAME IS NULL THEN 'DISCREPANCY'
         WHEN t1.CONSTRAINT_NAME <> t2.CONSTRAINT_NAME THEN 'NAME MISMATCH'
         ELSE 'COMPLETE MATCH' END [Status]
FROM (
    SELECT c.* 
    FROM msdb.INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
    JOIN msdb.INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
      ON C.TABLE_NAME = PK.TABLE_NAME
     AND C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME
    WHERE PK.CONSTRAINT_TYPE = 'PRIMARY KEY'
) t1
FULL JOIN (
    SELECT c.* 
    FROM msdb.INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
    JOIN msdb.INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
      ON C.TABLE_NAME = PK.TABLE_NAME
     AND C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME
    WHERE PK.CONSTRAINT_TYPE = 'PRIMARY KEY'
) t2 ON t2.TABLE_NAME = t1.TABLE_NAME
    AND t2.COLUMN_NAME = t1.COLUMN_NAME
于 2013-10-17T16:26:14.963 に答える