您可以使用 BULK 行集提供程序,用从 OPENROWSET 返回的结果填充一个表,并且为批量加载操作指定表选项。例如,以下代码将上一个查询的结果加载到表 MyTable 中,并请求禁用目标表中的约束检查:
INSERT INTO MyTable WITH (IGNORE_CONSTRAINTS)
SELECT col1, col2, col3
FROM OPENROWSET(BULK ''c:\temp\textfile1.txt'',
FORMATFILE = ''c:\temp\textfile1.fmt'') AS C(col1, col2, col3)
除了 IGNORE_CONSTRAINTS 选项以外,可以在加载操作中指定的其他表提示包括:BULK_KEEPIDENTITY、BULK_KEEPNULLS 和 IGNORE_TRIGGERS。
您还可以使用 BULK 提供程序,通过指定下列选项之一,将文件数据作为某个大型对象类型的单个列值返回:用于字符数据的 SINGLE_CLOB、用于 Unicode 数据的 SINGLE_NCLOB 以及用于二进制数据的 SINGLE_BLOB。当您使用上述选项之一时,您没有指定格式文件。您可以将文件加载(使用 INSERT 或 UPDATE 语句)到下列数据类型之一的大型对象列中:VARCHAR(MAX)、NVARCHAR(MAX)、VARBINARY(MAX) 或 XML。在下文中,您可以找到有关变长列的 MAX 说明符以及有关 XML 数据类型的详细信息。
作为将文件加载到大型列中的示例,以下 UPDATE 语句将文本文件“c:\temp\textfile101.txt”加载到客户 101 的表 CustomerData 中的列 txt_data 中:
UPDATE CustomerData
SET txt_data = (SELECT txt_data FROM OPENROWSET(
BULK ''c:\temp\textfile101.txt'', SINGLE_CLOB) AS F(txt_data))
WHERE custid = 101
请注意,一次只能更新一个大型列。
以下示例说明了如何使用 INSERT 语句将客户 102 的二进制文件加载到大型列中:
INSERT INTO CustomerData(custid, binary_data)
SELECT 102 AS custid, binary_data
FROM OPENROWSET(
BULK ''c:\temp\binfile102.dat'', SINGLE_BLOB) AS F(binary_data)
异常处理
SQL Server 2005 Beta 2 以 TRYCATCH Transact-SQL 结构的形式引入了一种简单但非常强大的异常处理机制。
以前版本的 SQL Server 要求在每个怀疑可能出错的语句之后包含错误处理代码。要将错误检查代码集中在一起,必须使用标签和 GOTO 语句。此外,诸如数据类型转换错误之类的错误会导致批处理终止;因此,无法用 Transact-SQL 捕获这些错误。SQL Server 2005 Beta 2 解决了这些问题中的很多问题。
现在可以捕获和处理过去会导致批处理终止的错误,前提是这些错误不会导致连接中断(通常是严重度为 21 及以上的错误,例如,表或数据库完整性可疑、硬件错误等等)。
在 BEGIN TRY/END TRY 块中编写您希望执行的代码,并且后面紧跟位于 BEGIN CATCH/END CATCH 块中的错误处理代码。请注意,TRY 块必须具有相应的 CATCH 块;否则,您将得到语法错误。作为一个简单的示例,请考虑以下 Employees 表:
CREATE TABLE Employees
(
empid INT NOT NULL,
empname VARCHAR(25) NOT NULL,
mgrid INT NULL,
/* other columns */
CONSTRAINT PK_Employees PRIMARY KEY(empid),
CONSTRAINT CHK_Employees_empid CHECK(empid > 0),
CONSTRAINT FK_Employees_Employees
FOREIGN KEY(mgrid) REFERENCES Employees(empid)
)
您希望编写代码以便将新的雇员行插入到该表中。您还希望用一些纠正性的活动响应失败情况。按如下方式使用新的 TRYCATCH 结构:
BEGIN TRY
INSERT INTO Employees(empid, empname, mgrid)
VALUES(1, ''