Nous souhaitons effectuer une mise à jour dans plusieurs bases de données SQL Server pour modifier toutes les valeurs NULL d'une certaine table en chaînes vides au lieu de NULL. Nous allons probablement le faire sur des centaines de bases de données. Le nom de la table sera toujours le même, mais les noms des colonnes sont variables en fonction de la configuration de l'application front-end (ne jugez pas ... je n'ai pas créé ce système).
Existe-t-il un moyen de mettre à jour toutes ces colonnes sans connaître le nom des colonnes à l’avance?
Vous pouvez passer le nom de la colonne en SQL dynamique:
declare @sql nvarchar (1000);
set @sql = N'update table set ' + @column_name + '= ''''';
exec sp_executesql @sql;
Vous pouvez rechercher dans la table sys.columns
et rejoindre le nom de la table ou 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
Vous pouvez utiliser le champ name
de la requête sys.columns comme base pour effectuer la mise à jour.
En supposant que vous souhaitiez uniquement toutes les colonnes de types varchar/char (ou modifiez le filtre de type en fonction de vos besoins):
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)
Ceci peut être réalisé avec des curseurs. Vous commencez par sélectionner les noms de colonne tels que @Darren, puis vous définissez un curseur avec ces valeurs et boucle
Open oColumnsCursor
Fetch Next From oColumnscursor
Into @ColumnName
While @@FETCH_STATUS=0
Begin
Set @oQuery = 'Update [DB]..[Table] Set [' + @ColumnName + '] = ''NewValue'' Where [' + @ColumnName + '] = ''OldValue'''
Execute(@oQuery)
Fetch Next From oColumnscursor Into @ColumnName
Set @oCount = @oCount + 1
End
Close oColumnsCursor;
Deallocate oColumnsCursor;