数据库查询结果的动态排序(4)

2008-04-02 10:50:55来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

四、动态执行

  使用动态执行技术,我们能够更轻松地编写出GetSortedShippers存储过程。使用这种方法时,我们只需动态地构造出SELECT语句,然后用EXEC()命令执行这个SELECT语句。假设传递给存储过程的参数是列的名字,存储过程能够大大缩短:

ALTER PROC GetSortedShippers

@ColName AS sysname

AS

EXEC('SELECT * FROM Shippers ORDER BY '

@ColName)

  在SQL Server 2000和7.0中,您能够用系统存储过程sp_ExecuteSQL替代Exec()命令。BOL说明了使用sp_ExecuteSQL比使用Exec()命令更有利的地方。一般地,假如满足以下三个条件,您能够在不授予存储过程所涉及对象权限的情况下,授予执行存储过程的权限:首先,只使用Data Manipulation Language(DML)语言(即SELECT,INSERT,UPDATE,DELETE);其次,任何被引用的对象都有和存储过程同样的任何者;第三,没有使用动态命令。

  上面的存储过程不能满足第三个条件。在这种情况下,您必须为任何需要使用存储过程的用户和组显式地授予Shippers表的SELECT权限。假如这一点能够接受的话,一切不存在问题。
类似地,您能够修改存储过程,使他接受一个列号参数,如Listing 8所示。

【Listing 8:用列号作为参数,动态执行(代码较长的方法)】

ALTER PROC GetSortedShippers

@ColNumber AS int

AS

DECLARE @cmd AS varchar(8000)

SET @cmd = 'SELECT * FROM Shippers ORDER BY '

CASE @ColNumber

WHEN 1 THEN 'ShipperID'

WHEN 2 THEN 'CompanyName'

WHEN 3 THEN 'Phone'

ELSE 'NULL'

END

EXEC(@cmd)

  注意,当您使用了函数时,您应该在一个变量而不是EXEC()命令内构造SELECT语句。此时,CASE表达式动态地确定使用哪一个列。更有一种更简短的格式,T-SQL允许在ORDER BY子句中指定SELECT清单中列的位置,如Listing 9所示。这种格式遵从了SQL-92标准,但ANSI SQL-99标准不支持这种格式,所以最好不要使用这种格式。

【Listing 9:列号作为参数,动态执行(代码较短的方法)】

ALTER PROC GetSortedShippers

@ColNumber AS int

AS

DECLARE @cmd AS varchar(8000)

SET @cmd = 'SELECT * FROM Shippers ORDER BY ' CAST(@ColNumber AS varchar(4))

EXEC(@cmd)

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 数据库查询结果的动态排序(5)

下一篇: 数据库查询结果的动态排序(2)