¿Cómo modificar todas las columnas sin especificar column_name?

¿Hay alguna forma de aplicar una declaración de modificación a TODAS las columnas de una tabla sin tener que especificar los nombres de las columnas? Esto solo se usaría en una tabla temporal. Necesito limpiar los datos duplicados en un informe.

Aquí hay una muestra de lo que me pregunto si es posible:

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

Todo lo que realmente necesito es mi #tempTable para permitir valores nulos en las columnas de las que originalmente obtiene datos de los que anteriormente no permitía valores nulos.

Por último, hay 2 razones por las que no quiero revisar y editar cada columna:

  1. Hay muchas columnas (~50) extraídas de al menos 10 tablas.
  2. No sé cuáles permiten nulo e investigar cuáles me llevaría los próximos dos días.

Cualquier ayuda será apreciada.

preguntado el 03 de mayo de 12 a las 20:05

4 Respuestas

De manera fea, pero funciona en un SqlServer Management Studio, al menos (probablemente se pueda usar como "cadenas")

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';

copiar resultado, pegar y ejecutar...

contestado el 05 de mayo de 12 a las 04:05

Se agregó tempdb. antes del esquema de información y funcionó exactamente como lo esperaba. ¡Impresionante guión! - Escribir aplicaciones

No estoy recopilando completamente lo que está tratando de lograr con sus tablas temporales, pero en cuanto a su primera pregunta, puede consultar las tablas sysobjects para el nombre de su tabla y luego modificar cada columna en esa tabla recorriendo la tabla syscolumns

Entonces, digamos que quiero recorrer cada columna en el maestro de la tabla:

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

puede cambiar @sql a lo que necesite que sea y eso debería obtenerlo

contestado el 03 de mayo de 12 a las 20:05

contestado el 23 de mayo de 17 a las 11:05

Supongo que esto es una carrera de una sola vez...

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

Copie y pegue el resultado en una ventana separada y ejecútelo.

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.