En raison du stockage des valeurs des signes diacritiques spécifiques à la langue (espagnol, français, allemand), j'essaie de changer le type de données d'une colonne en type de données Unicode.

  • Varchar à nvarchar
  • char à nchar

Donc, tous les types de données de colonne à leur type de données Unicode respectif.

Pour toutes les tables d'une base de données spécifique.

Est-il possible de le faire en une seule déclaration? Parce que faire avec l'instruction alter prend du temps.

ALTER TABLE dbo.Employee 
ALTER COLUMN FirstName NVARCHAR(255) NOT NULL

Merci beaucoup.

0
Sophia D'souza 1 mars 2021 à 08:41

1 réponse

Meilleure réponse

Nous créons d'abord une table temporaire et définissons les variables dont nous avons besoin pour les changements.

Ensuite, nous remplissons le tableau en récupérant les colonnes à modifier. J'ai entré la commande fetch ci-dessous et tout est clair.

Ensuite, pour chaque ligne du tableau, nous apportons les modifications souhaitées dans la base de données.

De plus, une colonne dans une table peut avoir une valeur de NULL, vous devez donc remplacer les valeurs NULL par une valeur avant de changer la colonne. J'ai remplacé les valeurs NULL par une valeur de 0.

Le code ci-dessous fonctionne parfaitement et correctement.

Seulement, j'ai entré dbo pour schema name à la recherche de colonnes. Découvrez le nom de votre schéma de base de données

--Container to Insert Id which are to be iterated
Declare @temp1 Table
(
  tablename varchar(100),
  columnname varchar(100),
  columnlength varchar(100),
  columntype varchar(100)
)
--Container to Insert records in the inner select for final output

Insert into @temp1 

SELECT t.TABLE_NAME,c.COLUMN_NAME,c.CHARACTER_MAXIMUM_LENGTH,c.DATA_TYPE FROM information_schema.tables t
join INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME = c.TABLE_NAME
WHERE t.table_schema='dbo'
and (DATA_TYPE = 'varchar' OR DATA_TYPE = 'char')

-- Keep track of @temp1 record processing
Declare @tablename varchar(100)
Declare @columnname varchar(100)
Declare @columnlength varchar(100)
Declare @columntype varchar(100)
Declare @SQL VarChar(1000)
Declare @vary varchar(100)
Declare @final varchar(1000)

While((Select Count(*) From @temp1)>0)
Begin


  Set @tablename=(Select Top 1 tablename From @temp1)
  Set @columnname=(Select Top 1 columnname From @temp1)
  Set @columnlength=(Select Top 1 columnlength From @temp1)
  Set @columntype=(Select Top 1 columntype From @temp1)


  if(@columntype = 'varchar')
    Set @columntype='nvarchar'
  else
    Set @columntype='nchar'
  --set null value with 0 value

  SELECT @SQL = 'UPDATE ' + @tablename + ' SET ' + @columnname + ' = 0 WHERE ' + @columnname  + ' IS NULL'
  Exec ( @SQL)


  SELECT @SQL = 'ALTER TABLE '
  SELECT @SQL = @SQL + @tablename
  select @vary = ' ALTER COLUMN ' + @columnname + ' ' + @columntype + '(' + @columnlength + ') NOT NULL'
  select @final = @sql + @vary

  --select @final
  Exec ( @final)

  Delete @temp1 Where tablename=@tablename and columnname = @columnname
End
1
meysam asadi 1 mars 2021 à 11:04