在SQL Server2005中实现数组映射(一)
在SQL Server2005中实现数组映射(二)
【IT168 专稿】
六、使用动态输入进行映射
在本部分的例子中,我们可以考虑使用取代对用户ID的硬编码,而使用从一个用户表中获得用户子集的方式。为了做到这一点,首先建立一个用户表,代码如下:
下面的代码再次使用了上面建立的Permissions表,不过是从用户表中而不是从一个常量列表中获得的用户:
要注意的是用户列表仍然通过@MainArray参数传入,但是并不使用常量列表,而是使用了一个SELECT表达式。由于@Permute标志已经打开,SP_map演示了类似'Smith%'的所有组合(有五个),还有三个元素的@AuxArray列表。如图7所示: 
当我们集合结果集时,可以按着下面的方法去做:
这个查询产生了很多结果集。我们也许会发现我们自己想利用sp_msForEachTablet提供任何查询。这样SP_map将会降低我们的结果集的简单性。第一步要做的在上面已经讨论过了,就是命名一个匿名的列:
... 我们会得到类似下面的错误(除非我们非常幸运):EXEC SP_map @StmtTemplate = ' EXEC sp_msForEachTable " select ''?'' as TableName" ', @Accumulate = 1
|
参数
|
数据类型
|
默认
|
描述
|
|
@StmtTemplate
|
nvarchar 2048
|
n-one
|
表示一个DML表达式(如SELECT、INSERT、DBCC等),这些表达式将被映射成表的集合或是其他的值。@StmtTemplate应该包含占位符<MAIN_ARG>和<AUX_ARG>。
|
|
@MainArray
|
nvarchar 2048
|
none
|
@MainArray可以是逗号分割的字符串列表,或是一个可以返回一个单独的结果集的SELECT表达式。每一项最多包含128的字符。
|
|
@AuxArray
|
nvarchar 2048
|
null
|
@AuxArray和@MainArray的格式类似。它也可以是由逗号分隔的字符串或是一个返回一个拥有一列的结果集。如果@AuxArray为空,<AUX_ARG>占位符不会在@StmtTemplate中描述
|
|
@Permute
|
bit
|
0
|
如果打开这个开关,那么<MAIN_ARG>和<AUX_ARG>的所有组合将被计算。如果关闭这个开关,那么@MainArray和@AuxArray必须有同样的结构。
|
|
@Accumulate
|
bit
|
0
|
这个参数为了返回多个结果集而设定,SP_map通过默认值返回一个被分割的结果集。通过设置@Accumulate标志可以代替将多个结果集聚合在单独的结果集中。
|
|
@AccumulateFilter
|
nvarchar 2048
|
null
|
当我们将多个结果集聚合在一个单独的结果集中时,这个结果集被存储在一个临时表中。由SP_map产生的语句序列以一个简单的SELECT * FROM #temp_table结尾。
|
|
@Process
|
bit
|
1
|
为了查看被产生的SQL页不执行它们,可@Process为0.这是非常有用的。然而,我们必须还设置@Verbose为一个非0的值。否则,不仅不会被执行,而且什么都不会输出。
|