2

主キーに基づいて、テーブルのリスト (~30) 内のデータを選別しようとしています。

私のアプローチは次のとおりです。 1.中間テーブルを作成し、各テーブルに必要なデータをロードします
2.元のテーブル
を切り捨てます 3.中間テーブルのデータを元のテーブルに挿入します。

これまでに使用したコードは次のとおりです。

declare @table nvarchar(max) 
open tab
fetch next from tab into @table
while(@@FETCH_STATUS = 0)
       begin
              print @table
             exec ('select * into ' +@table+'_intermediate from '+@table+' where P_ID in( select P_ID from pc_table )')
             exec ('truncate table '+@table)
             exec ('insert into '+@table+' select * from '+@table+'_intermediate')
             exec ('drop table '+@table+'_intermediate') 
            fetch next from tab into @table
       end
close tab
deallocate tab

エラーが発生しました:

Cannot insert an explicit value into a timestamp column. 
Use INSERT with a column list to exclude the timestamp column, 
or insert a DEFAULT into the timestamp column.

したがって、そのエラーは、タイムスタンプ列に何も挿入できないことを示しています。

タイムスタンプの選択を避けるために、選択を避ける必要があります (つまり、select * を使用します)。

タイムスタンプ型以外のすべての列を選択する簡単な方法はありますか?それとも、情報スキーマにアクセスして、各テーブルの動的選択ステートメントを作成する必要がありますか?

(または暗黙の質問、私がやろうとしていることを行うためのより良い方法はありますか?)

ありがとう

4

3 に答える 3

1

簡単に言えば、タイムスタンプ列がある場所には「null」を配置する必要があるということです。

この小さなスクリプトを作成して列のリストを作成し、そのリストを DML ステートメントに入れました。

         declare @sel_statement nvarchar(max)=''
         declare @col nvarchar(100) =''
         declare @num_rows int =0
         declare @dat_type nvarchar(30)

         declare cols cursor for
         select column_name, data_type 
         from information_schema.COLUMNS
         where TABLE_NAME = @table  --uses table fetched from tab cursor

         open cols

         fetch next from cols into @col, @dat_type
         while(@@FETCH_STATUS = 0)
                begin
                set @num_rows +=1
                if @dat_type = 'timestamp'
                     set @sel_statement += 'null'
                else  
                      set @sel_statement += @col 
                fetch next from cols into @col, @dat_type
                if @@FETCH_STATUS=0
                      set @sel_statement += ','
                end
         close cols
         deallocate cols 

それはこれまでで最も美しいものではありませんが、うまくいきました。

この問題に遭遇した場合、これが他の誰かに手を差し伸べることを願っています。

于 2015-02-02T22:04:12.983 に答える