日期:2011-05-02 15:21:00 来源:本站整理
数据库查询后果的动态排序(4)[MSSQL防范]
本文“数据库查询后果的动态排序(4)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
4、动态履行
利用动态履行技术,我们可以更轻松地编写出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) 以上是“数据库查询后果的动态排序(4)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论