Sql server E --EXEC sp_executesql@create; 到目前为止您写了什么?如果您有所有表的创建脚本,为什么不删除所有表(或数据库),然后重新运行创建脚本?删除对FK引用的表不起作用。对于FK未引用的表,则turncate。定义年龄。我有一个超过1

Sql server E --EXEC sp_executesql@create; 到目前为止您写了什么?如果您有所有表的创建脚本,为什么不删除所有表(或数据库),然后重新运行创建脚本?删除对FK引用的表不起作用。对于FK未引用的表,则turncate。定义年龄。我有一个超过1,sql-server,sql-server-2008,tsql,sql-server-2005,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,E --EXEC sp_executesql@create; 到目前为止您写了什么?如果您有所有表的创建脚本,为什么不删除所有表(或数据库),然后重新运行创建脚本?删除对FK引用的表不起作用。对于FK未引用的表,则turncate。定义年龄。我有一个超过100 GB的数据库,我有一个脚本,可以在20分钟内使用truncate和delete清除所有行。@拉吉夫:我已经写了一些东西来检索所需的信息,我会在有时间测试后尽快发布。@Blarn:大多数表都被FK引用,有200多个,我不想再等20分钟或更长

E --EXEC sp_executesql@create;

到目前为止您写了什么?如果您有所有表的创建脚本,为什么不删除所有表(或数据库),然后重新运行创建脚本?删除对FK引用的表不起作用。对于FK未引用的表,则turncate。定义年龄。我有一个超过100 GB的数据库,我有一个脚本,可以在20分钟内使用truncate和delete清除所有行。@拉吉夫:我已经写了一些东西来检索所需的信息,我会在有时间测试后尽快发布。@Blarn:大多数表都被FK引用,有200多个,我不想再等20分钟或更长时间。到目前为止,您写了什么?如果您有所有表的创建脚本,为什么不删除所有表(或数据库),然后重新运行创建脚本?删除对FK引用的表不起作用。对于FK未引用的表,则turncate。定义年龄。我有一个超过100 GB的数据库,我有一个脚本,可以在20分钟内使用truncate和delete清除所有行。@拉吉夫:我已经写了一些东西来检索所需的信息,我会在有时间测试后尽快发布。@Blarn:大多数表都被FK引用,有200多个,我不想再等20分钟了哇,如果有500张桌子,这根本不是很有效率,外键意味着你需要做很多工作来确定正确的顺序。是的。但是我们知道他是否有500张桌子吗?即使有10张,也需要大量的手动点击,而且很容易跳过桌子。是的。我想改进我的答案,并找到了一种节省工作的方法。@Aaron,Rajiv您可以在对象资源管理器中选择所有表,然后立即为所有表生成脚本。但是它很长。使用脚本,我还可以排除某些表。哇,如果有500个表,这根本不是很有效率,外键意味着您需要做大量工作来确定正确的顺序。是的。但是我们知道他是否有500张桌子吗?即使有10张,也需要大量的手动点击,而且很容易跳过桌子。是的。我想改进我的答案,并找到了一种节省工作的方法。@Aaron,Rajiv您可以在对象资源管理器中选择所有表,然后立即为所有表生成脚本。但是它很长。使用脚本,我还可以排除某些表。我想我已经找到了类似的解决方案,但是如果外键的
为ON(UPDATE | DELETE SET(DEFAULT | NULL)
或列的名称为spacesSure(如果列的名称为空格),则会出现问题。简单修复方法:添加QUOTENAME(上面更正).现在,如果你命名你的FK约束表呢?有各种各样的边缘情况,你可以花上几个小时来解决,但是你想要一个100%的防弹解决方案,或者只是一个一般的想法,如果你已经清楚地意识到缺少一些非典型的东西,你可以完善它?列名中的空格不是个人的选择,就像你一样你可以想象。但是你是对的,很难有什么“独特的防护”,我应该使用QUOTENAME。我想我已经找到了类似的解决方案,但是如果外键的
为ON(UPDATE | DELETE SET(DEFAULT | NULL)
或者列的名称为space,那么你就会遇到问题。简单的解决方法:添加QUOTENAME(以上更正).现在,如果你命名你的FK约束表呢?有各种各样的边缘情况,你可以花上几个小时来解决,但是你想要一个100%的防弹解决方案,或者只是一个一般的想法,如果你已经清楚地意识到缺少一些非典型的东西,你可以完善它?列名中的空格不是个人的选择,就像你一样你可以想象。但是你是对的,要有“白痴防护”是很困难的,我应该用引号。
IF OBJECT_ID('tempdb..#ForeignKeys') IS NOT NULL
    DROP TABLE #ForeignKeys;

WITH ForeignKeys AS (
SELECT
    QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS ParentTable
    , QUOTENAME(SCHEMA_NAME(rt.schema_id)) + '.' + QUOTENAME(rt.name) AS ReferenceTable
    , QUOTENAME(f.name) AS ConstraintName
    , STUFF(Parent.Cols, 1, 1, '') AS ParentColumns
    , STUFF(Reference.Cols, 1, 1, '') AS ReferenceColumns
    , REPLACE(f.update_referential_action_desc, '_', ' ') AS UpdateAction
    , REPLACE(f.delete_referential_action_desc, '_', ' ') AS DeleteAction
FROM
    sys.tables AS t
    LEFT JOIN sys.foreign_keys AS f
        ON f.parent_object_id = t.object_id
        AND f.type = 'F'
    LEFT JOIN sys.tables AS rt
        ON f.referenced_object_id = rt.object_id
    CROSS APPLY
    (
        SELECT
            ',' + QUOTENAME(COL_NAME(fc.parent_object_id, fc.parent_column_id))AS [text()]
        FROM
            sys.foreign_key_columns AS fc
        WHERE
            fc.constraint_object_id = f.object_id
        ORDER BY
            fc.constraint_column_id
        FOR XML PATH('')
    ) Parent(Cols)
    CROSS APPLY
    (
        SELECT
            ',' + QUOTENAME(COL_NAME(fc.referenced_object_id, fc.referenced_column_id)) AS [text()]
        FROM
            sys.foreign_key_columns AS fc
        WHERE
            fc.constraint_object_id = f.object_id
        ORDER BY
            fc.constraint_column_id
        FOR XML PATH('')
    ) Reference(Cols)
)
SELECT
    ParentTable AS TableName
    , 'ALTER TABLE ' + ParentTable + ' DROP CONSTRAINT ' + ConstraintName  AS DropCmd
    , 'TRUNCATE TABLE ' + ParentTable AS TruncateCmd
    , 'ALTER TABLE ' + ParentTable + ' ADD CONSTRAINT ' + ConstraintName + ' FOREIGN KEY('
        +  ParentColumns + ') REFERENCES ' + ReferenceTable + ' (' + ReferenceColumns 
        + ') ON UPDATE ' + UpdateAction 
        + ' ON DELETE ' + DeleteAction  COLLATE SQL_Latin1_General_CP1_CI_AS AS CreateCmd
INTO
    #ForeignKeys
FROM
    ForeignKeys
ORDER BY
 1;

-- SELECT * FROM #ForeignKeys

DECLARE @TableName SYSNAME
DECLARE @Sql NVARCHAR(MAX)

-- Drop all constraints
DECLARE FkCursor CURSOR FOR 
SELECT
    TableName
    , DropCmd
FROM
    #ForeignKeys
WHERE
    DropCmd IS NOT NULL     

OPEN FkCursor  
FETCH NEXT FROM FkCursor INTO @TableName, @Sql
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT @TableName + ' : ' + @sql
    EXEC sp_executesql @Sql
    FETCH NEXT FROM FkCursor INTO @TableName, @Sql
END
CLOSE FkCursor
DEALLOCATE FkCursor

-- Truncate all tables
DECLARE FkCursor CURSOR FOR 
SELECT
    TableName
    , TruncateCmd
FROM
    #ForeignKeys     

OPEN FkCursor  

FETCH NEXT FROM FkCursor INTO @TableName, @Sql
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT @TableName + ' : ' + @sql
    EXEC sp_executesql @Sql
    FETCH NEXT FROM FkCursor INTO @TableName, @Sql
END
CLOSE FkCursor
DEALLOCATE FkCursor

-- Create all foreign keys
DECLARE FkCursor CURSOR FOR 
SELECT
    TableName
    , CreateCmd
FROM
    #ForeignKeys
WHERE
    CreateCmd IS NOT NULL      

OPEN FkCursor  
FETCH NEXT FROM FkCursor INTO @TableName, @Sql
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT @TableName + ' : ' + @sql
    EXEC sp_executesql @Sql
    FETCH NEXT FROM FkCursor INTO @TableName, @Sql
END
CLOSE FkCursor
DEALLOCATE FkCursor

DROP TABLE #ForeignKeys;
DECLARE @drop NVARCHAR(MAX), @truncate NVARCHAR(MAX), @create NVARCHAR(MAX);

SELECT @drop = N'', @truncate = N'', @create = N'';

;WITH x AS
(
    SELECT id = f.[object_id],
      cname = QUOTENAME(f.name),
      ctable = QUOTENAME(OBJECT_SCHEMA_NAME(f.parent_object_id)) 
        + '.' + QUOTENAME(OBJECT_NAME(f.parent_object_id)),
      ccol = QUOTENAME(COL_NAME(fc.parent_object_id,fc.parent_column_id)),
      rtable = QUOTENAME(OBJECT_SCHEMA_NAME(f.referenced_object_id))
        + '.' + QUOTENAME(OBJECT_NAME(f.referenced_object_id)),
      rcol = QUOTENAME(COL_NAME(fc.referenced_object_id,fc.referenced_column_id)),
      ou = f.update_referential_action_desc COLLATE SQL_Latin1_General_CP1_CI_AS,
      od = f.delete_referential_action_desc COLLATE SQL_Latin1_General_CP1_CI_AS
    FROM sys.foreign_keys AS f
    INNER JOIN sys.foreign_key_columns AS fc
    ON f.[object_id] = fc.constraint_object_id
    -- where clause to leave out certain tables here
),
y AS
(
  SELECT 
    d = CHAR(13) + CHAR(10) + 'ALTER TABLE ' + ctable + ' DROP CONSTRAINT ' + cname + ';',
    c = CHAR(13) + CHAR(10) + 'ALTER TABLE ' + ctable + ' ADD CONSTRAINT ' + cname 
      + ' FOREIGN KEY (' + STUFF((SELECT ',' + ccol FROM x AS x2 
        WHERE x2.id = x.id FOR XML PATH('')), 1, 1, '')
      + ') REFERENCES ' + rtable + '(' + STUFF((SELECT ',' + rcol FROM x AS x3 
        WHERE x3.id = x.id FOR XML PATH('')), 1, 1, '') + ')'
    + CASE WHEN od <> 'NO_ACTION' THEN 
      ' ON DELETE ' + REPLACE(od, 'SET_', 'SET ') ELSE '' END
    + CASE WHEN ou <> 'NO_ACTION' THEN 
      ' ON UPDATE ' + REPLACE(ou, 'SET_', 'SET ') ELSE '' END
  FROM x
)
SELECT 
  @drop = @drop + d, 
  @create = @create + c
FROM y GROUP BY d,c;

SELECT @truncate = @truncate + CHAR(13) + CHAR(10) + 'TRUNCATE TABLE ' 
  + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ';'
  FROM sys.tables
  -- where clause to leave out certain tables here
;

-- use results to text. Note that for 200 tables you won't be able to
-- manually inspect the entire script in Management Studio because it
-- will only show a certain number of characters depending on settings.

SELECT @drop;
SELECT @truncate;
SELECT @create;

-- when you are happy, uncomment these:

--EXEC sp_executesql @drop;
--EXEC sp_executesql @truncate;
--EXEC sp_executesql @create;