1

同じサーバー上に 21 個の DB がありますが、それらは同じスキーマを持つことが「想定」されています (現時点ではスキーマをテーブル スキーマのみに制限しています) が、そうではありません。私の環境では、コンプライアンス ルールに従ってツール/アプリケーションをインストールできません。私が考えることができる唯一の方法は、21 個の DB すべてのスキーマを Excel で取得して比較することですが、面倒です。

21 個すべての DB のスキーマを比較し、違いを強調できる T-SQL の開発を誰かが教えてくれますか?

これらは私が必要とする列です: Table_Name 、列名、データ型、最大長、is_nullable、is_replicated、主キー

次の T-sql は、これを情報として引き出します。この情報を 21 の DB と比較するにはどうすればよいかについてのアイデアが必要です

SELECT    a.name Table_Name, c.name 'Column Name',
     t.Name 'Data type',
     c.max_length 'Max Length',
     c.is_nullable,a.is_replicated ,
     ISNULL(i.is_primary_key, 0) 'Primary Key'
FROM    Sys.tables a inner join      sys.columns c
On A.object_id=C.object_id
INNER JOIN 
     sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN 
     sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN 
     sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
     Order by 1,2

出発点が必要です

4

1 に答える 1

1

私はこのようなことを常に同様の制約の下で行う必要があり、そのために設計された専門的なツールの恩恵を受けないことも含まれます。1 つの方法を次に示します。

まず、テーブル情報を保持する一時テーブルを作成します。

CREATE TABLE #DbSchemas(
    DbName nvarchar(128) NULL,
    Table_Name sysname NOT NULL,
    [Column Name] sysname NULL,
    [Data type] sysname NOT NULL,
    [Max Length] smallint NOT NULL,
    is_nullable bit NULL,
    is_replicated bit NULL,
    [Primary Key] bit NOT NULL
)
GO

次に、文書化されていないシステム プロシージャに既にあるクエリをラップしてsp_MSforeachdb、各データベースで実行し、結果を #DbSchemas テーブルに追加します。

EXECUTE master.sys.sp_MSforeachdb 'USE [?];
    INSERT INTO #DbSchemas
    SELECT DB_NAME() DbName,   a.name Table_Name, c.name [Column Name],
         t.Name [Data type],
         c.max_length [Max Length],
         c.is_nullable,a.is_replicated ,
         ISNULL(i.is_primary_key, 0) [Primary Key]
    FROM    Sys.tables a inner join      sys.columns c
    On A.object_id=C.object_id
    INNER JOIN 
         sys.types t ON c.user_type_id = t.user_type_id
    LEFT OUTER JOIN 
         sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
    LEFT OUTER JOIN 
         sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
         Order by 1,2
    ;
';
go

これで、#DbSchemas テーブル内の任意のデータベースからデータをクエリできるようになります。

select * from #DbSchemas where Dbname = 'master'

最後に、それらを比較するには、次のようなものを使用できます。

SELECT  * FROM #DbSchemas s1
WHERE   DbName = 'msdb'
  AND NOT EXISTS(
    SELECT  * FROM #DbSchemas s2 
    WHERE   s2.DbName           = 'master'
      AND   s2.Table_Name       = s1.Table_Name
      AND   s2.[Column Name]    = s1.[Column Name]
      AND   s2.[Data type]      = s1.[Data type]
      AND   s2.[Max length]     = s1.[Max length]
      AND   s2.is_nullable      = s1.is_nullable
      AND   s2.is_replicated    = s1.is_replicated
      AND   s2.[Primary Key]    = s1.[Primary Key]
      )
于 2016-07-29T15:05:35.423 に答える