2つのテーブルの列を比較し、不足を追加する

SQL Server 2008を使用する私は2つのテーブルを持っています:[Source]と[Target]

ソーステーブルのすべての列をチェックし、それらがターゲットテーブルに存在するかどうかを確認したい。 彼らが存在しない場合は、私は列を追加したい。

私はこれを修正する手順を作成しました。私が苦労しているのは、データ型を正しく設定する方法だけです。 私はそれがvarchar分野であれば長さを指定しなければならないということです。場合は、intフィールド私は必要はありませんなど。利用可能なすべてのデータ型の個別のハンドリングを作成せずにこれを行う方法はありますか?

1

2 答え

これは不完全です...私は忘れた他のデータ型を扱わなければなりません(私は何も忘れていないと思いません)。しかし、私はそれを試して、それは動作します。

あなたの質問に答えるために、いいえ、あなたはデータ型を扱わなければなりません。

DECLARE @MasterTable    SYSNAME,
        @SlaveTable     SYSNAME,
        @txtSQL         VARCHAR(max)
SELECT  @MasterTable = 'orderheader',
        @SlaveTable = 'orderheader2'

DECLARE @myTable TABLE
(
    txtSQL VARCHAR(MAX)
)
INSERT INTO @myTable
( 
    [txtSQL] 
)
SELECT  'ALTER TABLE [dbo].[' + 
    @SlaveTable + 
    '] ADD [' + 
    a.[name] + 
    '] [' + 
    typ.[name] + 
    ']' + 
    CASE typ.[name]
        WHEN 'decimal' THEN '(' + CAST(a.[precision] AS VARCHAR(20)) + ',' + CAST(a.[scale] AS VARCHAR(20)) + ')'
        WHEN 'numeric' THEN '(' + CAST(a.[precision] AS VARCHAR(20)) + ',' + CAST(a.[scale] AS VARCHAR(20)) + ')'
        WHEN 'varchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        WHEN 'char' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        WHEN 'nvarchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        WHEN 'nchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        WHEN 'binary' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        WHEN 'varbinary' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')'
        ELSE ''
    END
FROM    (
          SELECT    col.*
          FROM      sys.tables tbl
                    INNER JOIN sys.columns col
                        ON tbl.[object_id] = col.[object_id]
          WHERE     tbl.[name] = @MasterTable
        ) a
        LEFT JOIN (
                    SELECT  col.*
                    FROM    sys.tables tbl
                            INNER JOIN sys.columns col
                                ON tbl.[object_id] = col.[object_id]
                    WHERE   tbl.[name] = @SlaveTable
                  ) b
            ON a.[name] = b.[name]
        INNER JOIN sys.types typ
            ON a.[system_type_id] = typ.[system_type_id]
WHERE   b.name IS NULL

WHILE EXISTS
(
    SELECT TOP 1 1
    FROM @myTable
)
BEGIN
    SELECT TOP 1 @txtSQL = txtSQL FROM @myTable
    DELETE FROM @myTable WHERE [txtSQL] = @txtSQL
    EXEC (@txtSQL)
END
2
追加された
私は今これを見た。私はそれをチェックアウトし、ポストバックします!ありがとう!
追加された 著者 user829237,

SQLの比較 Red Gate の質問にお答えしますか?

0
追加された
うん。これは手続きで行う必要があります。
追加された 著者 user829237,