使用 sp_msforeachtable 按顺序运行语句。很可能将事情分散到几个线程上会大大加快这个过程。使用 Service Broker,这可以在 SQL 代码中完成。
(以下是从内存中编写的代码,我没有可用于测试的 SQL Server。因此其中可能存在一些错误。只要有可用的服务器,我就会更新。)
首先创建一个激活程序
CREATE PROC p_enable_constraints
AS
DECLARE @handle UNIQUEIDENTIFIER
, @message sysname
, @sql nvarchar(max)
WHILE 1=1
BEGIN
BEGIN TRAN
WAITFOR ( RECEIVE TOP(1) @handle = conversation_handle,
@message = message_body
FROM ConstraintQueueReceive), TIMEOUT 1000;
IF @@rowcount = 0
begin
rollback
break;
end
set @sql = N'ALTER TABLE ' + quotename(@message) + N' WITH CHECK CONSTRAINT ALL'
exec (@sql)
if @@error <> 0
begin
rollback tran
break
end
COMMIT TRANSACTION
END
RETURN(0)
GO
设置队列和服务以发送和接收消息
CREATE QUEUE ConstraintQueueSend
CREATE SERVICE ConstraintServiceSend
CREATE QUEUE ConstraintQueueReceive
WITH STATUS = ON, ACTIVATION (PROCEDURE_NAME = p_enable_constraints
, MAX_QUEUE_READERS = 8
, EXECUTE AS SELF);
CREATE SERVICE [ConstraintServiceReceive] ON QUEUE ConstraintQueueReceive
现在创建一个为每个表提交消息的过程
CREATE PROC p_submit_enable_constraints_message @object sysname
AS
DECLARE @handle UNIQUEIDENTIFIER;
DECLARE @message sysname;
BEGIN TRANSACTION;
BEGIN DIALOG @handle FROM SERVICE [ConstraintServiceSend]
TO SERVICE [ConstraintServiceReceive]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @handle (@object);
COMMIT TRANSACTION;
END CONVERSATION @handle
GO
最后我们可以调用该过程来将它提交到队列中。
EXEC sp_msforeachtable 'EXEC p_submit_enable_constraints_message N''?'''
理想情况下,alter table 的结果会被捕获并发回。