web-dev-qa-db-fra.com

Instruction de mise à jour dynamique avec des noms de colonne variables

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?

13
jebar8

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;
15
tozka

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. 

3
Darren

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)
2
d89761

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;
0
RaRdEvA