SQL Server 2008: modification de type de données en bloc

J'ai une database SQL Server 2008 avec beaucoup de tables. J'ai utilisé le datatype datetime maintenant boiteux et je veux utiliser le nouveau et meilleur datetime2 . Dans la plupart des endroits où j'ai un champ datetime, le nom de colonne correspondant est Timestamp . Y a-t-il un endroit pour faire un changement en masse de datatime à datetime2 ?

Exécutez ceci dans Management Studio, copyz le résultat et collez-le dans la nouvelle window de requête:

 select 'ALTER TABLE ' + OBJECT_NAME(o.object_id) + ' ALTER COLUMN ' + c.name + ' DATETIME2 ' + CASE WHEN c.is_nullable = 0 THEN 'NOT NULL' ELSE 'NULL' END from sys.objects o inner join sys.columns c on o.object_id = c.object_id inner join sys.types t on c.system_type_id = t.system_type_id where o.type='U' and c.name = 'Timestamp' and t.name = 'datetime' order by OBJECT_NAME(o.object_id) 

La modification du type de données nécessite généralement des instructions ALTER TABLE :

 ALTER TABLE myTable ALTER COLUMN timestamp datetime2 [NOT] NULL 

Pour replace toutes les colonnes datetime par datetime2 dans une database et un schéma donnés:

 DECLARE @SQL AS NVARCHAR(4000) DECLARE @table_name AS NVARCHAR(255) DECLARE @column_name AS NVARCHAR(255) DECLARE @isnullable AS BIT DECLARE CUR CURSOR FAST_FORWARD FOR SELECT c.table_name, c.column_name, CASE WHEN c.is_nullable = 'YES' THEN 1 ELSE 0 END AS is_nullable FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.data_type = 'datetime' AND c.table_catalog = 'your_database' AND c.table_schema = 'your_schema' -- AND c.table_name = 'your_table' OPEN CUR FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable WHILE @@FETCH_STATUS = 0 BEGIN SELECT @SQL = 'ALTER TABLE ' + @table_name + ' ALTER COLUMN ' + @column_name + ' datetime2' + (CASE WHEN @isnullable = 1 THEN '' ELSE ' NOT' END) + ' NULL;' EXEC sp_executesql @SQL FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable END CLOSE CUR; DEALLOCATE CUR; 

Ce serait un peu une méthode de force brute, mais vous pouvez toujours searchr toutes les colonnes de datetime type datetime utilisant la vue sys.columns , récupérer le nom de la table et le nom de la colonne, parcourir cette list avec un slider et pour chaque input générez une instruction ALTER TABLE comme ceci:

 ALTER TABLE @tablename ALTER COLUMN @columnname datetime2 

Ensuite, exécutez cette déclaration avec EXEC . De toute évidence, vous devez avoir des permissions pour interroger sys.columns et pour ALTER toutes ces tables …

Excuses il n'y a pas plus de code dans cette réponse – ne pas avoir une copy de SSMS sur cette machine, et ne peut pas se souvenir de la syntaxe pour tout cela de la memory. 🙂

J'utiliserais une window de requête et afficherais toutes les instructions ALTER TABLE dont vous avez besoin pour cela. Une fois que vous les avez tous générés, vous pouvez exécuter le résultat sur la database.

Si vous select dans SYSCOLUMNS les noms des tables et des champs souhaités, vous pouvez générer les instructions dont vous avez besoin pour modifier toutes les colonnes de la database en datetime2 .

 ALTER TABLE {tablename} ALTER COLUMN {fieldname} datetime2 [NULL | NOT NULL]