快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

二、用列名字作为参数


  另外一个选择是让查询以参数的形式接收一个列名字。Listing 2显示了修改后的GetSortedShippers存储过程。CASE表达式根据接收到的参数,确定SQL Server在ORDER BY子句中使用哪一个列值。注重,ORDER BY子句中的表达式并未在SELECT清单中出现。在ANSI SQL-92标准中,ORDER BY子句中不答应出现没有在SELECT清单中指定的表达式,但ANSI SQL-99标准答应。SQL Server一直答应这种用法。


【Listing 2:用列名字作为参数,第一次尝试】


CREATE PROC GetSortedShippers

@ColName AS sysname

AS


SELECT *

FROM Shippers

ORDER BY

CASE @ColName

WHEN \\\'ShipperID\\\' THEN ShipperID

WHEN \\\'CompanyName\\\' THEN CompanyName

WHEN \\\'Phone\\\' THEN Phone

ELSE NULL

END


  现在,我们来试一下新的存储过程,以参数的形式指定ShipperID列:

EXEC GetSortedShippers \\\'ShipperID\\\'


  此时一切正常。但是,当我们视图把CompanyName列作为参数调用存储过程时,它不再有效:

EXEC GetSortedShippers \\\'CompanyName\\\'


  仔细看一下错误信息:

Server: Msg 245, Level 16, State 1, Procedure GetSortedShippers, Line 5

Syntax error converting the nvarchar value \\\'Speedy

Express\\\' to a column of data type int.


  它显示出,SQL Server试图把“Speedy Express”(nvarchar数据类型)转变成一个整数值――当然,这个操作是不可能成功的。出现错误的原因在于,按照“数据类型优先级”规则,CASE表示式中最高优先级的数据类型决定了表达式返回值的数据类型。“数据类型优先级”规则可以在SQL Server Books Online(BOL)找到,它规定了int数据类型的优先级要比nvarchar数据类型高。前面的代码要求SQL Server按照CompanyName排序输出,CompanyName是nvarchar数据类型。这个CASE表达式的返回值可能是ShipperID(int类型),可能是CompanyName(nvarchar类型),或Phone(nvarchar类型)。由于int类型具有较高的优先级,因此CASE表达式返回值的数据类型应该是int。
返回类别: 教程
上一教程: 跟我学SQL:(九)DATETIME和INTERVAL数据类型
下一教程: 如何迅速杀死占用过多资源(CPU,内存)的数据库进程

您可以阅读与"数据库查询结果的动态排序(2)"相关的教程:
· 数据库查询结果的动态排序(4)
· 数据库查询结果的动态排序(6)
· 数据库查询结果的动态排序(5)
· 数据库查询结果的动态排序(7)
· 数据库查询结果的动态排序(1)
    微笑服务 优质保证 索取样品