Eu as face cu cursor insa daca vreau neaparat sa evit cursorul si sunt "system administrator" atunci pot executa urmatorul script:
DECLARE @T TABLE (I INT IDENTITY(1,1) PRIMARY KEY, ORDERID INT, SqlStatement NVARCHAR(MAX));
INSERT INTO @T(SqlStatement,OrderID)
SELECT
'ALTER TABLE ' +
OBJECT_SCHEMA_NAME(parent_object_id)+ '.' +
OBJECT_NAME(parent_object_id) +
' DROP CONSTRAINT ' + name AS SqlStatement,
1 AS ORDERID
FROM sys.foreign_keys
UNION
SELECT
'ALTER TABLE ' +
OBJECT_SCHEMA_NAME(f.parent_object_id)+ '.' +
OBJECT_NAME(f.parent_object_id) +
' ADD CONSTRAINT FK_' +
OBJECT_NAME(f.parent_object_id) +
'_' +
OBJECT_NAME(f.referenced_object_id) +
'_' +
c.name + ' FOREIGN KEY (' + c.name + ') REFERENCES ' +
OBJECT_SCHEMA_NAME(f.referenced_object_id)+ '.' +
OBJECT_NAME(f.referenced_object_id) + '(' + sc.name + ')' +
CASE delete_referential_action
WHEN 0 THEN ''
WHEN 1 THEN ' ON DELETE CASCADE'
WHEN 2 THEN ' ON DELETE SET NULL'
WHEN 3 THEN ' ON DELETE SET DEFAULT'
END +
CASE update_referential_action
WHEN 0 THEN ''
WHEN 1 THEN ' ON UPDATE CASCADE'
WHEN 2 THEN ' ON UPDATE SET NULL'
WHEN 3 THEN ' ON UPDATE SET DEFAULT'
END
AS SqlStatement,
2 AS ORDERID
FROM sys.foreign_keys fk
JOIN sys.foreign_key_columns f
ON fk.object_id = f.constraint_object_id
JOIN sys.columns c
ON f.[parent_object_id]=c.[object_id] AND f.constraint_column_id = c.column_id
JOIN sys.columns sc
ON f.[parent_object_id]=sc.[object_id] AND f.referenced_column_id = sc.column_id
ORDER BY 2
DECLARE @j INT;
DECLARE @max INT;
DECLARE @v NVARCHAR(MAX);
SELECT @max = COUNT(*) FROM @T;
SET @j = 1;
WHILE @j < @max + 1
BEGIN
SELECT @v=SqlStatement FROM @T WHERE I=@j;
-- EXECUTE @v;
PRINT @v;
SET @j=@j+1;
END
Atentie e doar un template pentru SQL Server 2005.
Cristian Andrei Lefter, SQL Server MVP
MCT, MCSA, MCDBA, MCAD, MCSD .NET,
MCTS, MCITP - Database Administrator SQL Server 2005
http://sqlserver.ro