热门关键字: jsp web pl/sql pl webwor   →开发工具  操作系统
当前位置 : 无忧IT编程网 > 数据库开发 > SQL语言 > 正文

在SQL Server2005中实现数组映射二

来源:转载作者:无忧时间:08-01-28
二、在SQL中的基本映射
  让我们先看看图2显示的结构图:

  图2. 在SQL中的数组映射:首先,我们使用一个模板将一个输入数组值映射到一个输出数组中,然后执行这个输出数组。

  上面的转换图可用以下几点描述:
  1. 输入是一个表名列表。列表可以是常量或是动态的。
  2. 在本例子中的映射函数是一个SELECT模板,这个模板只不过是一个标准的带占位符的SELECT表达式。这些占位符表示要从这个列表中插入的元素。
  3. 输出是一个DML表达式集合,这些DML表达式将使用被替换的输入值。

  在读本文的下面部分之前,先看一下图3,图3显示了存储过程在操作微软的标准事例数据库AdventureWorks的实际执行结果。

  图3 SQL映射执行效果:SP_map将列表中的每一个表名映射到了SELECT模板表达式中,并使用分开的结果集返回

下面是我们需要做实现的SQL代码:

EXEC SP_map
@StmtTemplate = 'select count(*) as Rows from <MAIN_ARG>',
@MainArray = 'Person.Address, Person.Contact,
Production.Culture, Sales.Customer', @Verbose = 1

在上面代码中加入@Verbose标志是为了这个存储过程也可以使用如下的表达式:

select count(*) as Rows from Person.Address
select count(*) as Rows from Person.Contact
select count(*) as Rows from Production.Culture
select count(*) as Rows from Sales.Customer

注意:如果我们没有AdventureWorks数据库,可以使用从任何数据库获得的表名。

@StmtTemplate除了使用标号< MAIN_ARG>是一个标准的DML表达式,这个标号是一个占位符来替换我们的输入列表中的每一个元素。

  我们大家都知道,SQL并没有数组列表的概念。因此,SP-map通过了一个单独的字符串参(中间由逗号将元素分开)来模拟一个数组。由于这些代码是直接写在程序中的,因此,属于常量列表。

  三、在SQL中的聚合映射

  也许我们会有这样的疑问,SP_map对大的列表的处理分怎么样呢。对于上面的例子,假设我们提供了一个包含100个元素的列表。SP_map为每一个被执行的表达式返回一个结果集(也就是对每一个输入元素)。因此,会有很多可滚动的窗口。那么对于数据更多的列表,SP_map提供了一个@Accumulate标志,来将众多小的结果集合成一个。虽然从概念上非常简单,但所不同的是SP_map所做的主要功能将发生改变。这将重写我们的查询代码。在其中将一个新的包含输入元素的列。否则,我们将没有办法将输入和输出相连,如图4所示:

  打开@Accumulate标志后,将利用我们的SELECT表达式上的一个约束(就是所有被返回的字段必须被命名)。换句话说,'select count(*) from '将不再有效,而我们将使用'select count(*) as Count from '来取代原来的语句,如图4所示:

图4 聚合映射:打开@Accumulate标志后,将合并多个结果集为一个更便利的结果集

  如果我们忘记了,SQL Server将会出现一个类似下面的错误:

An object or column name is missing or empty.
For SELECT INTO statements, verify each column
has a name. For other statements, look for
empty alias names.
Aliases defined as "" or [] are not allowed.
Add a name or single space as the alias name.

我们可以通过设置@Verbose标志来查看代码。代码如下所示:
SELECT Convert(varchar(128),'Person.Address') as ItemName,
count(*) as Rows
INTO #Map_Temp_Table from Person.Address
INSERT INTO #Map_Temp_Table
SELECT 'Person.Contact', count(*) as Rows
from Person.Contact
INSERT INTO #Map_Temp_Table
SELECT 'Production.Culture', count(*) as Rows
from Production.Culture
INSERT INTO #Map_Temp_Table
SELECT 'Sales.Customer', count(*) as Rows
from Sales.Customer
select * from #Map_Temp_Table
drop table #Map_Temp_Table

  我们从上面的代码可以看到,SP_map使用了一个中间临时表秋收集独立的结果集。如果我们将verbosity标志从1设置到2,我们会看到更多更清晰的代码(这将显示除了实际执行的代码块外的中间CREATE和UPDATE模板)。SP_map直接从我们的表达式模板产生这些中间模板,然后使用这些中间模板从输入列表中映射数据。CREATE和UPDATE模板的代码如下:

  TEMPLATE (create):
  SELECT Convert(varchar(128),
  '<MAIN_ARG>') as ItemName, count(*) as Rows
  INTO #Map_Temp_Table from <MAIN_ARG>
  TEMPLATE (update):
  INSERT INTO #Map_Temp_Table
  SELECT '<MAIN_ARG>', count(*) as Rows from <MAIN_ARG>

  对于我们的输入列表的第一个元素,SP_map使用了CREATE模板动态地定义了一个临时表,并存储第一个结果集。对于后面的部分使用了UPDATE模板来向临时表追加行。当完成时,使用一条SELECT语句从临时表中查出所有的数据。并生成一个单独的结果集,最后删除临时表。

上一页:在SQL Server2005中实现数组映射一

下一页:轻松掌握SQL Server数据库的六个实用技巧

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 验证码: 验证码
查看所有评论
相关文章
站长推荐