在执行 SQL 任务中使用结果集
在 Integration Services 包中,结果集是否返回到执行 SQL 任务取决于该任务使用的 SQL 命令的类型。例如,SELECT 语句通常返回结果集,而 INSERT 语句通常不返回结果集。
结果集所包含的内容也因 SQL 命令而异。例如,SELECT 语句所返回的结果集可包含零行、单行或多行。但返回计数或总和的 SELECT 语句所返回的结果集仅包含单个行。
在执行 SQL 任务中使用结果集不只是要了解 SQL 命令是否返回结果集,以及结果集所包含的内容。还有其他使用要求和准则可帮助您在执行 SQL 任务中成功使用结果集。本主题的其余部分将介绍这些使用要求和准则:
指定结果集类型
使用结果集填充变量
在执行 SQL 任务编辑器中配置结果集
指定结果集类型
执行 SQL 任务支持下列结果集类型:
查询不返回结果时使用的**“无”**结果集。例如,该结果集用于在表中添加、更改和删除记录的查询。
查询仅返回一行时使用的**“单行”**结果集。例如,该结果集用于返回计数或总和的 SELECT 语句。
查询返回多行时使用的**“完整结果集”**结果集。例如,该结果集用于可检索表中所有行的 SELECT 语句。
查询返回 XML 格式的结果集时使用的**“XML”**结果集。例如,该结果集用于包含 FOR XML 子句的 SELECT 语句。
如果“执行 SQL 任务”使用了**“完整结果集”**结果集并且查询返回多个行集,则该任务仅返回第一个行集。如果该行集生成一个错误,则该任务将报告这个错误。如果其他行集生成错误,则该任务不会报告这些错误。
根据连接管理器的类型,由 SQL 语句返回的已经不是字符串的值可能隐式或显式转换为字符串。ADO 或 ODBC 连接管理器会将返回值隐式转换为字符串。OLE DB 连接管理器会将 DBTYPE_I8、DBTYPE_UI8、DBTYPE_NUMERIC、DBTYPE_GUID 和 DBTYPE_BYTES 数据类型的值显式转换为字符串。但 ADO.NET 连接管理器不会将返回值转换为字符串。
使用结果集填充变量
如果结果集类型为单行、行集或 XML,则可以将查询返回的结果集绑定到用户定义的变量。
如果结果集类型为“单行”,则可以使用列名作为结果集名称,将返回结果中的列绑定到一个变量,也可以使用列列表中列的序号位置作为结果集名称。例如,查询 SELECT Color FROM Production.Product WHERE ProductID = ? 的结果集名称可以是 Color 或 0。如果查询返回多个列,而您要访问所有列中的值,则必须将每列绑定到一个不同的变量。如果使用数字作为结果集名称,将列映射到变量,则数字将反映列在查询的列列表中显示的顺序。例如,在查询 SELECT Color, ListPrice, FROM Production.Product WHERE ProductID = ? 中,对 Color 列使用 0,对 ListPrice 列使用 1。使用列名作为结果集名称的功能将依赖于所配置任务要使用的访问接口。并非所有访问接口都使列名可用。
某些返回单个值的查询可能不包括列名称。例如,语句 SELECT COUNT (*) FROM Production.Product 不返回列名称。可以使用序数位置 0 作为结果名称来访问返回结果。若要按列名称访问返回结果,则查询必须包括 AS <别名> 子句来提供列名称。语句 SELECT COUNT (*)AS CountOfProduct FROM Production.Product 提供 CountOfProduct 列。然后可以使用 CountOfProduct 列名称或序数位置 0 来访问返回结果列。
如果结果集类型为**“完整结果集”或“XML”**,则必须使用 0 作为结果集名称。
当您将一个变量映射到结果集类型为“单行”的结果集时,该变量的数据类型必须与该结果集包含的列的数据类型兼容。例如,如果结果集包含 String 数据类型的列,则它不能映射到 numeric 数据类型的变量。XML 结果集只能映射到数据类型为 String 或 Object 的变量。如果该变量的数据类型为 String,则“执行 SQL 任务”返回一个字符串,并且 XML 源可以使用 XML 数据。如果该变量的数据类型为 Object,则执行 SQL 任务返回一个文档对象模型 (DOM) 对象。完整结果集必须映射到数据类型为 Object 的变量。返回结果是一个行集对象。您可以编写自定义任务来定位行集对象,并访问有关行集中的列和数据的信息。
下表总结了可以映射到结果集的变量数据类型。
结果集类型 |
变量的数据类型 |
对象的类型 |
---|---|---|
单行 |
与结果集中的类型列兼容的任意类型。 |
不适用 |
完整结果集 |
Object |
如果任务使用本机连接管理器(包括 ADO、OLE DB、Excel 和 ODBC 连接管理器),则返回的对象为 ADO Recordset。 如果任务使用托管连接管理器(如 ADO.NET 连接管理器),则返回的对象为 System.Data.DataSet。 |
XML |
String |
String |
XML |
Object |
如果任务使用本机连接管理器(包括 ADO、OLE DB、Excel 和 ODBC 连接管理器),则返回的对象为 MSXML6.IXMLDOMDocument。 如果任务使用托管连接管理器(如 ADO.NET 连接管理器),则返回的对象为 System.Xml.XmlDocument。 |
您可在执行 SQL 任务作用域或包作用域内定义变量。如果变量的作用域为包,则结果集可用于包中的其他任务和容器,并可用于执行包或执行 DTS 2000 包任务所运行的所有包。
如果将变量映射到“单行”结果集,则 SQL 语句返回的非字符串的值可能会转换为字符串。是否发生此转换或此转换是隐式还是显式的取决于所用的连接管理器类型:
使用 ADO.NET 连接管理器时,将不会发生转换。
使用 ADO 或 ODBC 连接管理器时,此转换将隐式进行。
使用 OLE DB 或 Excel 连接管理器时,连接管理器会显式地将 DBTYPE_NUMERIC、DBTYPE_GUID 和 DBTYPE_BYTES 类型的值转换为字符串。
有关如何将结果集加载到变量中的信息,请参阅如何在执行 SQL 任务中将结果集映射到变量。
在执行 SQL 任务中配置结果集
有关可以在 SSIS 设计器中设置的结果集的属性的详细信息,请单击下列主题:
有关如何在 SSIS 设计器中设置这些属性的详细信息,请单击以下主题:
外部资源
- msftisprodsamples.codeplex.com 上的 CodePlex 示例 Execute SQL Parameters and Result Sets(执行 SQL 参数和结果集)
|