如何在不指定column_name的情况下更改所有列?

时间:2012-05-03 19:40:04

标签: sql sql-server

有没有办法将alter语句应用于表中的所有列而不必指定列名?这只会在我需要清理报告中的重复数据的临时表中使用。

以下是我想知道它是否可能的样本:

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,它允许最初获取数据的列中的空值,之前不允许空值。

最后,有两个原因我不想通过并编辑每一栏:

  1. 有很多列(~50)从至少10个表中拉出来。
  2. 我不知道哪些允许null并且研究哪些会在接下来的两天带我去。
  3. 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分: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';

复制结果,粘贴并执行......

答案 1 :(得分:3)

我并没有完全收集您要使用临时表完成的任务,但就您的第一个问题而言,您可以在sysobjects表中查询表的名称,然后通过循环访问syscolumns来更改该表中的每一列表

所以我想说我想遍历表master中的每一列:

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更改为您需要的任何内容,并且应该得到它

答案 2 :(得分:1)

答案 3 :(得分:0)

我猜这是一次性运行......

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

将结果复制并粘贴到单独的窗口中并运行。