ALTER NOCHECK CONSTRAINT - SQL Server 2008附近的语法不正确

时间:2015-11-24 14:59:40

标签: sql sql-server-2008 bcp alter

我正在尝试使用BCP命令使用ALTER语句禁用表的约束。我的代码如下:

SET @disableConstraints = 'SQLCMD -E -S server-Name -d '+@databaseName+' -Q "EXEC sp_MSforeachtable @command1 = ALTER TABLE '+@schemaName+'.'+@tableName+' NOCHECK CONSTRAINT ALL;" >> Z:\Log\ErrorLog.txt'

但是,当我执行xp_cmdshell命令时,ErrorLog.txt会输出错误信息:

  

消息156,级别15,状态1,服务器服务器名称,行1   关键字'ALTER'附近的语法不正确。

我一直在用单引号和双引号摆弄,但我没有到达任何地方。

有人可以帮助发现语法错误吗?

3 个答案:

答案 0 :(得分:0)

你错过了改变之前的双引号

SET @disableConstraints = 'SQLCMD -E -S server-Name -d ' + @databaseName + ' -Q EXEC sp_MSforeachtable @command1 = "ALTER TABLE ' + @schemaName + '.' + @tableName + ' NOCHECK CONSTRAINT ALL;" >> Z:\Log\ErrorLog.txt'

答案 1 :(得分:0)

在游标中仅使用此查询:

DECLARE @sql nvarchar(max);
DECLARE tables_cursor FOR...
OPEN tables_cursor;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT QUOTENAME(@schemaName)+'.'+QUOTENAME(@tableName);
    set @sql = 'ALTER TABLE '+QUOTENAME(@schemaName)+'.'+QUOTENAME(@tableName)+' NOCHECK CONSTRAINT ALL;';
    EXEC sp_executesql @sql;

    FETCH NEXT FROM tables_cursor INTO @schemaName, @tableName;
END
CLOSE tables_cursor;
DEALLOCATE tables_cursor;

如果所有操作都在同一服务器和数据库上执行,则不需要使用sqlcmd并连接到另一台服务器。使用EXEC和sp_executesql的动态SQL可以实现。

答案 2 :(得分:0)

在ALTER开头和ALL

结束时需要两个单引号
SET @disableConstraints = 'SQLCMD -E -S server-Name -d '+@databaseName+' -Q "EXEC sp_MSforeachtable @command1 = ''ALTER TABLE '+@schemaName+'.'+@tableName+' NOCHECK CONSTRAINT ALL'';" >> Z:\Log\ErrorLog.txt'