4.
处理该消息。
5.
通过合并 Messages 表和 @Msgs 表变量,将消息状态设置为“done”。
6.
如果没有在 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 在内部确定何时以内联方式存储值以及何时使用指针。您现在能够对小型和大型数据使用统一的编程模型。带有 MAX 说明符的变长数据类型受到列、变量、参数、比较、触发器和所有字符串函数等的支持。
作为使用 MAX 说明符的示例,以下代码创建了一个名为 CustomerData 的表:
CREATE TABLE CustomerData ( custid INT NOT NULL PRIMARY KEY, txt_data VARCHAR(MAX) NULL, ntxt_data NVARCHAR(MAX) NULL, binary_data VARBINARY(MAX) NULL )
该表包含列 custid (该列被用作主键)以及可为空值的列 txt_data 、ntxt_data 和 binary_data (它们分别用数据类型 VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 定义,可以存储大型数据)。
为了从带有 MAX 说明符的动态列中读取块,可以按照与常规动态列相同的方式使用 SUBSTRING 函数。为了更新块,可以使用 UPDATE 语句的增强语法,它现在提供了 WRITE 方法。增强的 UPDATE 语句的语法为:
UPDATE table_name SET column_name.WRITE(@chunk, @offset, @len) WHERE ...
WRITE 方法从 @offset 位置移除 @len 字符,并且在该位置插入 @chunk 。请注意,@offset 是从零开始的,意味着偏移量 0 表示 @chunk 中的第一个字符的位置。为了演示 WRITE 方法的用法,请首先用客户 ID 102 和 txt_data 列中的值“Customer 102 text data”在 CustomerData 表中插入一个行:
INSERT INTO CustomerData(custid,txt_data) VALUES(102, 'Customer 102 text data')
以下 UPDATE 语句将“102”替换为“one hundred and two”:
UPDATE CustomerData SET txt_data.WRITE('one hundred and two', 9, 3) WHERE custid = 102
当 @chunk 为 NULL 时,@len 被忽略,并且值在 @offset 位置截断。以下语句移除了从偏移量 28 直到结尾的所有数据:
UPDATE CustomerData SET txt_data.WRITE(NULL, 28, 0) WHERE custid = 102
当 @len
为 NULL 时,从 @offset
到结尾的所有字符都被移除,并且 @chunk 被追加。以下语句移除了从偏移量 9 直到结尾的所有数据,并且追加了“102”:
UPDATE CustomerData SET txt_data.WRITE('102', 9, NULL) WHERE custid = 102
当 @offset 为 NULL 时,@len 被忽略,并且在结尾追加了 @chunk 。以下语句在结尾追加了字符串“ is discontinued”:
UPDATE CustomerData SET txt_data.WRITE(' is discontinued', NULL, 0) WHERE custid = 102
XML 和 XQuerySQL Server 2005 Beta 2 引入了多个与 XML 相关的增强功能,以使您可以自然地存储、查询和更新 XML 结构化数据。您可以在同一数据库中存储 XML 和关系数据,并且利用现有的数据库引擎进行存储和查询处理。
引入了一个新的 xml 数据类型。xml 数据类型可以用于表列,甚至可以进行索引。xml 数据类型还可以在变量、视图、函数和存储过程中使用。可以通过关系 FOR XML 查询生成 xml 数据类型,或者使用 OPENXML 将其作为关系行集进行访问。可以将架构导入到数据库中,或者从数据库中导出架构。可以使用架构来验证和约束 XML 数据。可以通过使用 XQuery 查询和修改 XML 类型化数据。xml 数据类型在触发器、复制、批量复制、DBCC 和全文搜索中受到支持。但是,xml 是不可比较的,这意味着您无法在 xml 列上定义 PRIMARY KEY、UNIQUE 或 FOREIGN KEY 约束。
下列示例使用了 xml 数据类型。以下代码定义了一个名为 @x 的 XML 变量,并且将客户定单数据加载到该变量中:
USE AdventureWorks DECLARE @x AS XML SET @x = (SELECT C.CustomerID, O.SalesOrderID FROM Sales.Customer C JOIN Sales.SalesOrderHeader O ON C.CustomerID=O.CustomerID ORDER BY C.CustomerID FOR XML AUTO, TYPE) SELECT @x
以下代码创建了一个带有 xml 列的表,并且通过使用 OPENROWSET 函数将一个 XML 文件批量加载到该表中:
CREATE TABLE T1 ( keycol INT NOT NULL PRIMARY KEY, xmldoc XML NULL ) INSERT INTO T1(keycol, xmldoc) SELECT 1 AS keycol, xmldoc FROM OPENROWSET(BULK 'C:\documents\mydoc.xml', SINGLE_NCLOB) AS X(xmldoc)
SQL Server 2005 Beta 2 还引入了对 XQuery(它是一个 W3C 标准 XML 查询语言)的支持。Microsoft 在 SQL Server 中为该标准提供了扩展,以允许使用 XQuery 进行插入、更新和删除。XQuery 借助于用户定义类型 (UDT) 样式方法嵌入在 Transact-SQL 中。
XQuery 提供了下列查询方法:
•
操纵 XML 数据:






