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 允许在它最初从中获取数据的列中存在空值,而这些列以前不允许空值。

最后,我不想浏览和编辑每一列有两个原因:

  1. 从至少 10 个表中提取了许多列 (~50)。
  2. 我不知道哪些允许 null 并且研究哪些允许我需要接下来的两天。

任何帮助将不胜感激。

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

查看这个问题Create a nullable column using SQL Server SELECT INTO?

于 2012-05-03T19:56:47.420 回答
0

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

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

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

于 2012-05-03T20:00:43.100 回答