DECLARE @DeletedOrders TABLE
(
orderid INT,
orderdate DATETIME,
empid INT,
custid VARCHAR(5),
qty INT
)
WHILE 1=1
BEGIN
BEGIN TRAN
DELETE TOP(5000) FROM Orders
OUTPUT deleted.* INTO @DeletedOrders
WHERE orderdate < ''20030101''
INSERT INTO OrdersArchive
SELECT * FROM @DeletedOrders
COMMIT TRAN
DELETE FROM @DeletedOrders
IF @@rowcount < 5000
BREAK
END
作为消息处理方案的示例,请考虑以下 Messages 表:
USE tempdb
CREATE TABLE Messages
(
msgid INT NOT NULL IDENTITY ,
msgdate DATETIME NOT NULL DEFAULT(GETDATE()),
msg VARCHAR(MAX) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT(''new''),
CONSTRAINT PK_Messages
PRIMARY KEY NONCLUSTERED(msgid),
CONSTRAINT UNQ_Messages_status_msgid
UNIQUE CLUSTERED(status, msgid),
CONSTRAINT CHK_Messages_status
CHECK (status IN(''new'', ''open'', ''done''))
)
对于每个消息,您都存储了消息 ID、条目日期、消息文本以及表明该消息尚未处理(“new”)、正在处理(“open”)还是已经处理(“done”)的状态。
以下代码模拟了一个会话,该会话通过使用一个每秒钟用随机文本插入消息的循环生成消息。刚刚插入的消息的状态为“new”,因为状态列被分配了默认值“new”。同时从多个会话中运行该代码:
USE tempdb
SET NOCOUNT ON
DECLARE @msg AS VARCHAR(MAX)
WHILE 1=1
BEGIN
SET @msg = ''msg'' + RIGHT(''000000000''
+ CAST(CAST(RAND()*2000000000 AS INT)+1 AS VARCHAR(10)), 10)
INSERT INTO dbo.Messages(msg) VALUES(@msg)
WAITFOR DELAY ''00:00:01'';
END
以下代码模拟一个会话,该会话使用下列步骤处理消息:
构建一个不断处理消息的无限循环。
使用 UPDATE TOP(1) 语句锁定一个可用的新消息(用 READPAST 提示跳过被锁定的行),并且将它的状态更改为“open”。
使用 OUTPUT 子句在 @Msgs 表变量中存储消息属性。
处理该消息。
通过合并 Messages 表和 @Msgs 表变量,将消息状态设置为“done”。
如果没有在 Messages 表中找到新的消息,等待一秒钟。
从多个会话中运行该代码:
USE tempdb
SET NOCOUNT ON
DECLARE @Msgs TABLE(msgid INT, msgdate DATETIME, msg VARCHAR(MAX))
WHILE 1 = 1
BEGIN
UPDATE TOP(1) Messages WITH(READPAST) SET status = ''open''
OUTPUT inserted.msgid, inserted.msgdate, inserted.msg
INTO @Msgs
WHERE status = ''new''
IF @@rowcount > 0
BEGIN
PRINT ''Processing message''
-- process message here
SELECT * FROM @msgs
UPDATE M
SET status = ''done''
FROM Messages AS M
JOIN @Msgs AS N
ON M.msgid = N.msgid;
DELETE FROM @Msgs
END
ELSE
BEGIN
PRINT ''No messages to process.''
WAITFOR DELAY ''00:00:01''
END
END
在运行完该模拟之后,立即停止所有插入和处理消息的会话,并且删除 Messages 表:
USE tempdb
DROP TABLE Messages
动态列的 MAX 说明符
SQL Server 2005 通过使用语法 (MAX) 引入 MAX 说明符,增强了变长数据类型 VARCHAR、NVARCHAR 和 VARBINARY 的能力。带有 MAX 说明符的变长数据类型用增强功能取代了数据类型 TEXT、NTEXT 和 IMAGE。使用带有 MAX 说明符的变长数据类型作为大型对象数据类型 TEXT、NTEXT 和 IMAGE 的替代类型有多个优点。无须使用显式指针操作,因为 SQL Server 在内部确定何时以内联方式存储值以及何时使用指针。您现在能