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

Incorrect syntax near ALTER NOCHECK CONSTRAINT - SQL Server 2008

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

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 会打印一条错误消息:

Msg 156, Level 15, State 1, Server server-Name, Line 1
Incorrect syntax near the keyword 'ALTER'.

我一直在摆弄单引号和双引号,但我一无所获。

谁能帮忙找出语法错误?

你错过了 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'

在你的游标中只使用这个查询:

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 将执行此操作。

在 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'