Sql server 使用脚本禁用表中的约束-sql server

Sql server 使用脚本禁用表中的约束-sql server,sql-server,tsql,Sql Server,Tsql,我有一堆表格和一堆约束,它们阻止我从excel导入数据。我知道我必须使用alter table“MyTableName”nocheck constraint“MyConstraints”禁用约束,并在导入完成时重新启用它们 因为有相当多的表具有相当多的约束,所以我尝试从脚本更新所有内容 我将要禁用的表的所有名称放入另一个名为MyTableList的表中,其中唯一的一列是我要禁用的所有表的名称 然后,我使用下面的脚本希望禁用该约束,但我不断得到语法错误。(如果没有alter table命令,我的脚

我有一堆表格和一堆约束,它们阻止我从excel导入数据。我知道我必须使用alter table“MyTableName”nocheck constraint“MyConstraints”禁用约束,并在导入完成时重新启用它们

因为有相当多的表具有相当多的约束,所以我尝试从脚本更新所有内容

我将要禁用的表的所有名称放入另一个名为MyTableList的表中,其中唯一的一列是我要禁用的所有表的名称

然后,我使用下面的脚本希望禁用该约束,但我不断得到语法错误。(如果没有alter table命令,我的脚本运行良好)

我如何绕过这一点并使脚本运行(手动启用和禁用工作,但它太耗时) 以下是我的脚本:

declare @TableInQuestion nvarchar(150)
declare @ConstraintInQuestion nvarchar(150)
declare MyConstraintToDisable cursor
    local static read_only forward_only
for
    SELECT        OBJECT_NAME(sys.objects.object_id) AS ConstraintName, 
                  OBJECT_NAME(sys.objects.parent_object_id) AS TableName
    FROM          sys.objects INNER JOIN
                  MyTableList 
    ON            OBJECT_NAME(sys.objects.parent_object_id) = MyTableList.Description
    WHERE         (sys.objects.type_desc LIKE '%CONSTRAINT') 

open MyConstraintToDisable
fetch next from MyConstraintToDisable
into @ConstraintInQuestion, @TableInQuestion
while @@FETCH_STATUS=0
begin
   print @ConstraintInQuestion+', '+ @TableInQuestion 
   alter table @TableInQuestion nocheck constraint @ConstraintInQuestion
   print 'Done'
   fetch next from MyConstraintToDisable
   into @ConstraintInQuestion, @TableInQuestion
end
close MyConstraintToDisable
deallocate MyConstraintToDisable

它一直说语法alter table不正确。请帮忙。我是sql编程的新手。

要在sql语句中使用变量的值,需要构建一个字符串,然后执行该字符串。所以我会改变你现在的路线

alter table@TABLINQUISE nocheck constraint@CONSTRAINTINQUISE

像这样的(未经测试)

声明@sql nvarchar(max)='alter table['+@TableInQuestion+']nocheck约束['+@ConstraintInQuestion+']

exec(@sql)


我建议使用更为集中的目录视图,如
sys.tables
sys.default\u constraints
等。此外:执行此操作时,必须使用动态SQL,例如,必须将SQL语句构造为
NVARCHAR
字符串,然后使用
EXEC(@Stmt)
EXEC sp_executesql@stmt
要执行该语句,您可以发布收到的确切错误消息吗please@PaulHunt:语法含糊不清。我是SQL编程的新手,无法解释什么是真正不正确的。“MSG 102,级别15,状态1,行19附近的‘@ TabLeNeQu疑问’不正确语法。”如果这很难开发或维护,您可能还需要考虑无限制的大容量加载。