2012-10-11 106 views
10

Estamos buscando hacer una actualización en varias bases de datos de SQL Server para cambiar todos los valores NULL en una tabla determinada para que sean cadenas vacías en lugar de NULL. Posiblemente vamos a estar haciendo esto en cientos de bases de datos. El nombre de la tabla siempre será el mismo, pero los nombres de las columnas son variables en función de cómo esté configurada la aplicación de front-end (no juzgue ... No creé este sistema).Declaración de actualización dinámica con nombres de columna variables

¿Hay alguna manera de hacer una actualización en todas estas columnas sin conocer los nombres de las columnas con anticipación?

Respuesta

12

puede pasar el nombre de la columna en SQL dinámico:

declare @sql nvarchar (1000); 
set @sql = N'update table set ' + @column_name + '= '''''; 

exec sp_executesql @sql; 
+3

Por favor [siempre use 'quotename'] (http://stackoverflow.com/a/6285111/11683) alrededor de nombres de objetos dinámicos. – GSerg

+2

@GSerg +1 por mencionar 'quotename()'. Diré que su uso aquí parece un poco superfluo dado que esto fue solo para algunos DML internos. Si fuera un sproc para ser ejecutado con la entrada del usuario desde un sitio público (o infernal, incluso interno), estaría todo incluido. – CaptainMarvel

2

Puede mirar en la tabla sys.columns y unirse en el nombre de la tabla o object_id.

DECLARE @OBJ_ID INT 

SELECT @OBJ_ID = OBJECT_ID 
FROM SYS.tables 
WHERE name = 'YOURTABLE' 

SELECT * FROM SYS.columns 
WHERE OBJECT_ID = @OBJ_ID 

Usted puede utilizar el campo de la consulta name sys.columns como base para llevar a cabo la actualización en.

1

Suponiendo desea que todas las columnas de únicos tipos VARCHAR/CHAR (o cambiar el filtro de tipo a lo que sea necesario):

DECLARE @tableName varchar(10) 
SET @tableName = 'yourtablenamehere' 

DECLARE @sql VARCHAR(MAX) 
SET @sql = '' 

SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;' 
FROM sys.columns c 
INNER JOIN sys.tables t ON c.object_id = t.object_id 
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id 
WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar') 

EXEC (@sql) 
Cuestiones relacionadas