nécessaire de le faire aujourd'hui pour toutes les tables utilisateur dans un schéma, et n'a pas été satisfait de l'une des réponses existantes. En particulier, certaines de mes colonnes datetime avaient des valeurs par défaut, dont personne n'avait besoin, mais gênaient les commandes ALTER TABLE. J'ai donc écrit un script qui supprime simplement ces valeurs par défaut, puis modifie les colonnes. Il préserve la nullité et peut gérer les noms contenant des espaces, des traits d'union, etc. Attention, il ne recréera pas les valeurs par défaut par la suite.
Si vous êtes dans la même situation, vous pouvez utiliser ce script stable et testé, ce qui rend également sûr qu'il n'y a pas troncature silencieuse de la variable nvarchar (max) utilisé pour composer les instructions DDL:
DECLARE @sql AS nvarchar(max)=N''
--1. "ALTER TABLE [Tablename] DROP CONSTRAINT [DF__Tablename__Colname__Obfuscation]"
SELECT @sql=CAST('' AS nvarchar(MAX))[email protected]
+N'ALTER TABLE ['+o.[name]+N'] DROP CONSTRAINT ['+co.[name]+']'
FROM sysconstraints c
INNER JOIN sysobjects o ON o.[id]=c.[id]
INNER JOIN syscolumns col ON col.[id]=o.[id] AND col.colid=c.colid
INNER JOIN sysobjects co ON co.[id]=c.constid
WHERE col.xtype=61 --datetime
EXEC sp_executesql @sql
--2. change type of all datetime columns
SELECT @sql=N''
SELECT @sql=CAST('' AS nvarchar(MAX))[email protected]
+N'ALTER TABLE ['
+convert(nvarchar(max),t.name)
+N'] ALTER COLUMN ['
+convert(nvarchar(max),c.name)
+N'] datetime2 '
+CASE WHEN c.is_nullable = 1 THEN N'' ELSE N'NOT' END
+N' NULL;'+convert(nvarchar(max),char(13)+char(10))
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types st ON st.system_type_id = c.system_type_id
WHERE st.name=N'datetime'
AND t.xtype=N'U' --user tables only
ORDER BY t.[name]
EXEC sp_executesql @sql
il utilise la syntaxe anciens et tables schéma, il travaille à partir de la version SQL Server 2008 (qui a été le premier à soutenir datetime2
) à travers 2016.
Pourquoi vous rejoignons trois tables lorsque toutes ces informations peuvent être obtenues auprès information_schema .columns? – Kibbee
@van, @David. Vous pouvez vérifier la colonne is_nullable dans sys.Colonnes à vérifier si NOT NULL est nécessaire dans ALTER COLUMN –