2

列名を指定せずに、テーブル内のすべての列に変更ステートメントを適用する方法はありますか? これは、レポート内の重複データをクリーンアップする必要がある一時テーブルでのみ使用されます。

これが可能かどうか疑問に思っていることのサンプルです:

select T1.Column1, T1.Column2, T1.Column3, T2.Column1, T2.Column2
into #templateTable
from Table1 T1
join Table2 T2 on T1.Column1 = T2.Column2

alter table #templateTable
alter column * null

本当に必要なのは #tempTable で、以前は null 値を許可していなかったデータを最初に取得した列で null 値を許可することだけです。

最後に、各列を調べて編集したくない理由が 2 つあります。

  1. 少なくとも 10 個のテーブルから多数の列 (~50) が取り出されています。
  2. どれが null を許可するかはわかりません。どれが許可するかを調査するには、次の 2 日かかります。

どんな助けでも大歓迎です。

4

4 に答える 4

4

醜い方法ですが、少なくともSqlServer Management Studioで動作します(おそらく「文字列」として使用できます)

select 'alter table ' + table_name + ' alter column '+ column_name +' ' + data_type + 
(case 
  when character_maximum_length is not null and CHARACTER_MAXIMUM_LENGTH <> -1 then ' (' + CAST(CHARACTER_MAXIMUM_LENGTH as varchar) +')' 
  when CHARACTER_MAXIMUM_LENGTH = -1 then '(MAX)'
  else '' end)  + ' null;'  from tempdb.information_schema.COLUMNS
where TABLE_NAME = '<YOUR TABLE NAME>'
and IS_NULLABLE='NO';

結果をコピーして貼り付けて実行...

于 2012-05-03T20:13:22.810 に答える
3

一時テーブルで達成しようとしていることを完全に収集しているわけではありませんが、最初の質問に関しては、テーブルの名前について sysobjects テーブルをクエリし、syscolumns テーブルをループしてそのテーブルの各列を変更できます。

テーブルマスターの各列をループしたいとしましょう:

declare @i int
declare @colcount int
declare @column varchar(max)
declare @sql nvarchar(max)

set @i = 1
set @colcount = (select MAX(colID) from syscolumns where ID = (select id from sysobjects        
where name = 'master'))

WHILE @i < @colcount
BEGIN

set @column = (select name from syscolumns where ID = (select id from sysobjects where name = 'master') and colid = @i)

set @sql = 'select top 1000 [' + @column + '] from master'

EXECUTE(@sql)

set @i = @i + 1

End

@sql を必要なものに変更することができ、それを取得する必要があります

于 2012-05-03T19:57:45.987 に答える
1

この質問を確認してくださいSQL Server SELECT INTOを使用してnull可能な列を作成しますか?

于 2012-05-03T19:56:47.420 に答える
0

これは1回限りの実行だと思います...

select 'alter table xxx alter column ' + columnname + ...
from information_schema.columns
where ...

結果をコピーして別のウィンドウに貼り付け、実行します。

于 2012-05-03T20:00:43.100 に答える