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

幸运的东泽

幸运的东泽

2016-01-29 16:16

数据库查询结果的动态排序(2),数据库查询结果的动态排序(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。
 
展开更多 50%)
分享

猜你喜欢

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

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

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

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

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

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

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

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

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

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

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

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

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

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

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在网吧中如何使用双ADSL线路

在网吧中如何使用双ADSL线路

《雷霆战机》攻略之顺利闯关的4个小技巧

《雷霆战机》攻略之顺利闯关的4个小技巧
下拉加载更多内容 ↓