问题
Is there a way to write a script that examines each table in the database, looking for a uniqueidentifier column named ID, and then add a DEFAULT constraint of NEWID() to the column if a DEFAULT constraint does not exist?
回答1:
Edited per OP's commented clarification
This script creates a DEFAULT constraint of NEWID() on any uniqueidentifier columns named ID that do not already have a DEFAULT constraint.
SET NOCOUNT ON
DECLARE @tableVarId int
DECLARE @alterSql nvarchar(MAX)
DECLARE @columnsNeedingDefault TABLE
(
TableVarId int IDENTITY (1,1) PRIMARY KEY,
AlterSql nvarchar(MAX)
)
INSERT INTO @columnsNeedingDefault (AlterSql)
SELECT
'ALTER TABLE ' + QUOTENAME(a_Table.[name]) +
' ADD CONSTRAINT [DF_' + a_Table.[name] + '_' + a_Column.name +
'] DEFAULT NEWID() FOR ' + QUOTENAME(a_Column.name)
FROM
sys.columns AS a_Column
INNER JOIN
sys.tables AS a_Table ON a_Column.[object_id] = a_Table.[object_id]
WHERE
a_Column.[name] = 'ID'
AND
a_Column.user_type_id = 36 -- uniqueidentifier
AND
NOT EXISTS
(
SELECT
*
FROM
sys.default_constraints AS a_DefaultConstraint
WHERE a_DefaultConstraint.parent_object_id = a_Table.[object_id]
AND a_DefaultConstraint.parent_column_id = a_Column.column_id
AND a_DefaultConstraint.type_desc = 'DEFAULT_CONSTRAINT'
)
SET @tableVarId = (SELECT MIN(TableVarId) FROM @columnsNeedingDefault)
WHILE @tableVarId IS NOT NULL
BEGIN
SELECT @alterSql = AlterSql FROM @columnsNeedingDefault
PRINT @alterSql
EXEC sp_executesql @alterSql
SET @tableVarId = (SELECT MIN(TableVarId) FROM @columnsNeedingDefault
WHERE TableVarId > @tableVarId)
END
来源:https://stackoverflow.com/questions/4481397/sql-server-add-default-constraints-to-all-tables