1

SQL Server 2005 を使用しており、テーブル内のすべての行を選択するが、特定の型の列のみを選択する select ステートメントを作成する必要があります。私の場合、xml、text、ntext、image、または非バイナリ CLR ユーザー定義型の列を除くすべての列が必要です。

それが問題です。なぜ私がこれを行っているのか知りたい場合は、読み進めてください。EXCEPTこの質問で概説されているものと同様に、2 つのデータベースの各テーブルの違いを識別するために使用しています: SQL compare data from two tables。コメントで提案された理由がわからないINTERSECTので、代わりに UNION ALL を使用しています。

私が使用しているコードは次のとおりです。

(select *, 'table a first' as where_missing from A EXCEPT select *,'table a first' as where_missing from B)
union all
(select *,'table b first' as where_missing from B EXCEPT select *, 'table b first' as where_missing from A)

一部のテーブルには、 では機能しない列タイプが含まれていますEXCEPT。したがって、それらの列を選択したくありません。この情報は information_schema.columns から取得できますが、上記の例で「*」の代わりにそれを使用できる良い方法はありますか?

ありがとう!

4

1 に答える 1

0

動的 SQL を使用する以外にそれを行う方法はないと思います。最初に列を選択します:

declare @columns nvarchar(max);
select @columns = stuff( 
    (select ', ' + c.name
    from sys.tables t
    join sys.columns c on t.object_id = c.object_id
    join sys.types ty on c.system_type_id = ty.system_type_id
    where t.name = 'A'
    and ty.name not in ('text', 'ntext', 'xml', 'image')
    for xml path(''))
, 1, 2, '');

次に、クエリを実行します。

declare @sql nvarchar(max);
set @sql = 'select ' + @columns + ', ''table a first'' as where_missing from A';
exec (@sql);
于 2013-04-29T10:42:12.630 に答える