有没有办法将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,它允许最初获取数据的列中的空值,之前不允许空值。
最后,有两个原因我不想通过并编辑每一栏:
任何帮助将不胜感激。
答案 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 ...
将结果复制并粘贴到单独的窗口中并运行。