¿Cómo modificar todas las columnas sin especificar column_name?
Frecuentes
Visto 1,636 veces
2
¿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:
- Hay muchas columnas (~50) extraídas de al menos 10 tablas.
- No sé cuáles permiten nulo e investigar cuáles me llevaría los próximos dos días.
Cualquier ayuda será apreciada.
4 Respuestas
4
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
3
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
1
Mira esta pregunta ¿Crear una columna anulable usando SQL Server SELECT INTO?
contestado el 23 de mayo de 17 a las 11:05
0
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 sql sql-server or haz tu propia pregunta.
Se agregó tempdb. antes del esquema de información y funcionó exactamente como lo esperaba. ¡Impresionante guión! - Escribir aplicaciones