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'
我正在尝试使用 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'