- ベストアンサー
2つのTBのデータ比較
お世話になります。 TBが300強で、各TBのフィールド数、型はそれぞれのDBがあります。 これと同じ構造のDBがもう1つあり、 クエリを用いて2つのDBのTBデータを比較しようとしています。 イメージはtablediff.exeです。 現在、TB名を持ってきてEXCEPTというクエリを作成したのですが、 EXCEPTではTEXT型の比較をすることができません。 どのようにすればTEXT型の比較をすることができるのでしょうか。 ご教示をお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SQL Server 2005/2008ですと、varchar(MAX)型がありますのでvarchar(MAX)に変換すれば比較可能です。 SELECT * FROM Table1 EXCEPT SELECT * FROM Table2 ではなく、 SELECT FLD1,FLD2,....,CONVERT(varchar(MAX),FLD29),FLD30 FROM Table1 EXCEPT SELECT FLD1,FLD2,....,CONVERT(varchar(MAX),FLD29),FLD30 FROM Table2 テーブルのフィールド名とデータ型を取得して、このEXCEPT文をVB側で組み上げてもいいわけですが、 テーブル名だけをとってくれば、以下のクエリブロックを一気に投げても結果は得られます。 DECLARE @tbl1 sysname='テーブル1'; DECLARE @tbl2 sysname='テーブル2'; DECLARE @flds varchar(max); SELECT @flds=ISNULL(@flds+',','')+CASE WHEN TYPE_NAME(system_type_id) IN ('text','ntext') THEN 'CONVERT(varchar(MAX),'+name+')' ELSE name END FROM sys.columns WHERE object_id=OBJECT_ID(@tbl1); EXEC ('SELECT '+@flds+' FROM '+@tbl1+' EXCEPT SELECT '+@flds+' FROM '+@tbl2); ただし、SQL Server 2000にはvarchar(MAX)はなく、varcharの最長は8000バイトです。 TEXTに収録されている内容の最長が8000バイトを超えているならば、一気に比較することはできず、DATALENGHTHとSUBSTRINGで8000バイトまでに分割して比較するようにします。 (ここまで読んで大変だと思うようなら、別の方法を考えた方がいいです) ところで、EXCEPT文というのは「AのうちBにないものを返す」というものであって、 SELECT * FROM Table1 EXCEPT SELECT * FROM Table2 だけでは、Table2に余計なデータがあってもわかりません。 SELECT * FROM Table1 EXCEPT SELECT * FROM Table2 SELECT * FROM Table2 EXCEPT SELECT * FROM Table1 の両方を実行して初めて差異の有無を確認できます。念のため。
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
SQL Serverのバージョンを書く習慣をつけましょう。 (SQL Server 2000までとそれ以降ではずいぶん違うため) クエリでやりたいわけですね? SELECT * FROM TABLE1 EXCEPT SELECT * FROM TABLE2 という方式では無理です。 (フィールド名も取得しないと)。 ここから先はバージョンを考慮して書くと長くなるので。。
お礼
バージョンを記載していなくて申し訳ございません。 バージョンは2000、2008があります。 > クエリでやりたいわけですね? はい。 やはりフィールド名の取得をしないといけないのですね。 お手数をお掛けいたしますが、よろしくお願いいたします。