功能强大的全新 T-SQL 语法极大地提升了 SQL Server 的可编程性

时间:2007-02-12 00:00:00  来源:  作者:

USE tempdb CREATE TABLE MsgQueue ( msgid INT NOT NULL IDENTITY PRIMARY KEY, msgdata VARCHAR(15) NOT NULL )

打开一个或者更多连接,并在每个连接中运行以下代码,周期性地在表中插入新的消息:www.iTbulo.com-ZO8xOW1

SET NOCOUNT ON USE tempdb WHILE 1 = 1 BEGIN INSERT INTO MsgQueue VALUES('Msg' + CAST(CAST(RAND()*1000000000 AS INT) AS VARCHAR(10))) WAITFOR DELAY '00:00:01' END

接下来,您需要再打开几个其他的新连接,并在每个连接中运行图 4 中的代码,模拟对新到消息的处理。www.iTbulo.com-ZO8xOW1

返回页首返回页首 BULK 行集提供程序

Yukon 引入了新的 BULK 行集提供程序,这使您可以在 OPENROWSET 函数中指定以关系形式高效地访问文件。可以按类似于使用 BULK INSERT 语句的方式使用 BULK 提供程序,但是不用将输出发送给表。您必须指定一个格式文件,这与使用 bcp.exe 或者 BULK INSERT 语句时的格式文件相同。以下代码说明了如何使用格式文件 c:\temp\textfile1.fmt 访问称为 c:\temp\textfile1.txt 的文件,为结果表提供了别名 C,并为结果列提供了别名 col1、col2 和 col3:www.iTbulo.com-ZO8xOW1

SELECT col1, col2, col3 FROM OPENROWSET(BULK 'c:\temp\textfile1.txt', FORMATFILE = 'c:\temp\textfile1.fmt') AS C(col1, col2, col3)

除了 FORMATFILE 选项以外,您还可以在 OPENROWSET 函数的括号中指定以下选项:CODEPAGE、DATAFILETYPE、FIELDTERMINATOR、FIRSTROW、LASTROW 和 ROWTERMINATOR。您还可以使用 INSERT SELECT 将数据高效地加载到一个表中并可以为加载选项指定表提示:www.iTbulo.com-ZO8xOW1

INSERT INTO MyTable WITH (BULK_CHECK_CONSTRAINTS) SELECT col1, col2, col3 FROM OPENROWSET(BULK 'c:\temp\textfile1.txt', FORMATFILE = 'c:\temp\textfile1.fmt') AS C(col1, col2, col3)

其他可以指定为表提示的选项包括:BULK_BATCHSIZE、BULK_FIRE_TRIGGERS、BULK_KEEPIDENTITY、BULK_KEEPNULLS、BULK_KILOBYTES_PER_BATCH、BULK_MAXERRORS 和 ROWS_PER_BATCH。www.iTbulo.com-ZO8xOW1

使用 BULK 行集提供程序,您可以比以前使用常规 DML 更容易地将一个文件加载到表的列中。现在,对于大对象您不用再局限于 TEXT、NTEXT 和 IMAGE 数据类型,还可以使用 VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 数据类型。新的 MAX 选项允许您用操作常规数据类型相同的方式操作大对象。例如,以下 UPDATE 语句将一个文本文件存储到一个定义为 VARCHAR(MAX) 的表列中:www.iTbulo.com-ZO8xOW1

UPDATE LOBs SET clob_col = (SELECT clob_data FROM OPENROWSET(BULK 'c:\temp\textfile1.txt', SINGLE_CLOB) AS C(clob_data)) WHERE keycol = 1

SINGLE_NCLOB 选项告诉 SQL Server,大对象是字符格式的。类似的,SINGLE_CLOB 指定了一个常规字符格式的大对象,而 SINGLE_BLOB 指定了二进制格式。返回的列的名称是 BulkColumn,但是正如前面的代码片段所说明的,您可以为其指定自己的别名。www.iTbulo.com-ZO8xOW1

返回页首返回页首 TOP 选项

Yukon 中的 T-SQL TOP 选项有两处显著的功能增强。现在您可以将一个表达式指定为 TOP 的参数,表达式可以包含变量甚至是独立的查询。您还可以通过改进型 DML (INSERT, UPDATE, DELETE) 使用 TOP 选项。www.iTbulo.com-ZO8xOW1

为了指定一个表达式,必须将它用括号括起来。当不使用 PERCENT 选项时,表达式应该是 BIGINT 数据类型的;当使用 PERCENT 选项时,应该是范围从 0 到 100 的一个浮点值。以下代码说明了如何使用带有一个变量的表达式,以按所请求数量返回 AdventureWorks 数据库中 SalesOrderHeader 的最早定单:www.iTbulo.com-ZO8xOW1

USE AdventureWorks DECLARE @n AS BIGINT SET @n = 5 SELECT TOP (@n) * FROM SalesOrderHeader AS SOH ORDER BY OrderDate, SalesOrderID

SalesOrderID 用作附加键。类似的,以下示例说明了如何使用 PERCENT 选项按所请求百分比返回最早定单:www.iTbulo.com-ZO8xOW1

DECLARE @p AS FLOAT SET @p = 0.01 SELECT TOP (@p) PERCENT * FROM SalesOrderHeader AS SOH ORDER BY OrderDate, SalesOrderID

应得到 4 行结果,因为 SalesOrderHeader 表包含 31,519 行,而 31,519 x .0001 舍入之后等于 4。www.iTbulo.com-ZO8xOW1

通过改进型 DML 允许启用 TOP 的主要动机是替代 SET ROWCOUNT 选项,这一选项 SQL Server 无法很好地进行优化。SET ROWCOUNT 选项经常修改,以用来对大量的行进行批处理,防止事务日志爆满,以及避免单独的锁提升为完全的表锁。要想了解如何使用新的 TOP 功能成批地删除行,首先将 SalesOrderHeader 表的内容复制到 MySalesOrderHeader,并运行以下代码创建 OrderDate 和 SalesOrderID 列的索引:www.iTbulo.com-ZO8xOW1

SELECT * INTO MySalesOrderHeader FROM SalesOrderHeader CREATE UNIQUE CLUSTERED INDEX idx_uc_OrderDate_SalesOrderID ON MySalesOrderHeader(OrderDate, SalesOrderID)

要以 1,000 个为一批删除定单年份早于 2003 的所有行,使用以下代码:www.iTbulo.com-ZO8xOW1

WHILE 1 = 1 BEGIN DELETE TOP (1000) FROM MySalesOrderHeader WHERE OrderDate < '20030101' IF @@rowcount < 1000 BREAK END

SQL Server 对这样的代码所进行的优化,比使用 SET ROWCOUNT 选项要高效得多。现在,您可以不要 MySalesOrderHeader 表了:www.iTbulo.com-ZO8xOW1

DROP TABLE MySalesOrderHeader


文章评论

共有 0人发表了评论 查看完整内容

推荐教程

最新教程