设为首页 收藏本站
查看: 604|回复: 0

[经验分享] Transact SQL教程(三)

[复制链接]

尚未签到

发表于 2016-11-12 06:55:57 | 显示全部楼层 |阅读模式
  使用CASE控制语句执行
  假设你想在网页上显示你喜欢站点的名称,URL,和关于它的简单描述。更进一步,你想在列出这些站点时在站点的名称旁边指明每一个网站的类型。比 如,在政府机关网站的旁边,你会显示单词Government;在商业网站的旁边,显示单词Commercial。为了做到这一点,你可能会创建一个具有 4列的表。前三列和原先的一样,分别是名称列,URL列,简单描述列。另外你可能会添加一个新列,该列为每一个网站的类型。
  但在实际上,你不需要这样做…有一种能获得同样的结果但是更好的方法。
  按 照上面的做法,你的数据表中就会包含多余的信息。因为在URL列中已经包含了每一个网站类型的信息。通过查看每一个URL最后的三个字母,你就能确定某个 网站是商业的,政府的和教育的等等。所以你不需要在数据表中添加新列重复同样的信息。但是当你在读取数据表中的记录时你是如何在URL列中获取该信息的 呢?你可以使用CASE表达式来做到这一点。如下面的例子所示:
  SELECT
  (
  CASE
  WHEN site_url LIKE “%edu” THEN “Educational”
  WHEN site_url LIKE “%gov” THEN “Government”
  WHEN site_url LIKE “%com” THEN “Commercial”
  ELSE “Other”
  END
  ) “TYPE”,
  site_name “Name”,
  site_URL “URL”,
  site_desc “Description”
  FROM site_directory
  注意
  字母.edu,.gov,和.com都是顶级域名的例子,目前还有许多的顶级域名在使用,比如,假如某个网站的域名以字母.cn结尾,这就指明该网站建在中国大陆。
  当上面的SELECT语句执行时,你就会接收到正确的结果。为了返回正确的值,我们使用CASE表达式对site_url列进行了检测。比如,当site_url列的值以三个字母edu结尾时,就会返回值Educational。下面就是从该查询返回结果的一个例子:
  Type
Name
URL
Description
  ……………..
………………
厖厖厖
厖厖厖
  Commercial
Microsoft
www.microsoft.com
The Creators of Active Server Pages
  Commercial
Yahoo
www.yahoo.com
One of the best Internet Directories
  Commercial
Collegescape
www.collegescape.com
Apply to over 50 colleges online
  Educational
MIT
www.mit.edu
The Massachusetts Institute of Technology
  Government
The whitehouse
www.whitehouse.gov
The residence of the Prisedent
  使 用CASE语句,你可以测试不同的条件,并且基于不同的结果返回不同的值。对于每一个测试,都有对应的WHEN短句。在该例子中,当在WHEN短句后面的 语句为真时,返回在相应的THEN短句后面的值。如果没有一个WHEN短句后面的语句为真,则返回在ELSE短句后面的值。
  所有的多个WHEN短句和可以选择的单个ELSE短句都必须包含在表达式CASE和END之间。关键字CASE指明CASE语句的开始。而关键字END指明CASE语句的结束。
  CASE语句具有另外一种稍微不同的格式。考察在下面的例子内是如何使用CASE语句的:
  SELECT
  (CASE
  site_name
  WHEN “Yahoo” THEN “Internet Directory”
  WHEN “Microsoft” THEN “Software Giant”
  ELSE “Other”
  END
  )”Type”,
  site_name “Name”,
  site_URL “URL”,
  site_desc “Description”
  FROM site_directory
  该例子同样显示网站列表的类型,名称,URL和简要描述。所不同的是,在该例子中,每个网站的类型是由网站的名称决定的,而不是URL。下面就是该批处理的结果:
  Type
Name
URL
Description
  Software Giant
Microsoft
www.microsift.com
The Creators of Active Server Pages
  Internet Directory
Yahoo
www.yahoo.com
One of the best Internet Directories
  Other
Collegescape
www.collegescape.com
Apply to over 50 college online
  Other
MIT
www.mit.edu
The Massachusetts Institute of Technology
  Other
The whitehouse
www.whitehouse.gov
The residence of the President
  (5 row(s) affected)
  请注意在该例子中,CASE例子是如何书写的。在该CASE语句中,在WHEN短语后面并没有跟一个语句,而是要与site_name列的值相比较的值。
  当你具有多个条件且每一个条件都是可真或可假时,你必须使用第一种CASE语句格式。假如你需要把一个值和多个值比较时,则使用第二种格式。
  使用RETURN语句从批处理中返回
  为了从批处理中退出,你可以使用RETURN语句。考察下面的例子:
  IF DATENAME(dw,GETDATE())=”Saturday”
  BEGIN
  PRINT “It is Saturday”
  RETURN
  END
  PRINT “It is some other day”
  当该批处理在星期天执行时,在条件语句后面的语句块就会执行。当碰到RETURN语句时,该批处理立即就退出了。这也意味着下面的语句仅仅在不是星期天的某一天显示:
  It is some other day
  把语句组入到事务中
  假如你想在你的网站上出售商业卡。首先,为了做到这一点,你必须创建两个表格,一个表格包含了要付帐的信用卡帐号的列表。另外一个表则包含了定购产品的定单的列表。无论何时,当一个客户在访问你的站点时定购了商业卡,你需要把信息同时添入到两个表格中。
  现 在假设有一个访问你站点的客户定购了商业卡。首先该客户的信用卡号添加到信用卡表中。然而就在这一时刻。你Web服务器的硬盘驱动器突然坏了。该客户的定 单并没有保留到产品定单表中。这就会使事情变得很糟糕。来访者的信用卡为商业卡付了账,但是确没有收到定购的产品。此时定购的客户肯定会对你的行为感到生 气。你该怎样阻止该事情的发生呢?
  在本节中,将会用到下面的三个语句:BEGIN TRANSACTION,COMMIT TRANSACTION和ROLLBACK TRANSACTION。一个事务(transaction)是一组语句,这组语句要么全部执行,要么全部不执行。下面就是如何使用这些语句的一个简单的 例子:
  BEGIN TRANSACTION
  INSERT credit_cards (username,ccnumber)
  VALUES(‘Andrew Jones’,’5555-55-555-55-5555’)
  INSERT orders(username) VALUES (‘Andrew Jones’)
  COMMIT TRANSACTION
  在 该例子中,我们使用BEGIN TRANSACTION 和COMMIT TRANSACTION来定义事务块.在该块中显示的语句只有在执行COMMIT TRANSACTION后才发生效用。假如在到达该语句之前的任一点发生了错误,所有在该事务中的语句都不会发生效用。比如在上面的例子中,如果你的硬盘 在执行完第一个INSERT语句而在第二个语句之前发生了硬盘错误。没有数据会插入到任一表中。第一个语句会倒转回去,并不会有如何效果。
  你可以使用ROLLBACK TRANSACTION语句来显式地倒转一个事务,如下所示:
  BEGIN TRANSACTION
  INSERT credit_cards(username,ccnumber)
  VALUES(‘Andrew Jones’,’5555-55-555-55-5555’)
  INSERT orders(username) VALUES(‘Andrew Jones)
  IF DATENAME(dw,GETDATE())=”Tuesday”
  ROLLBACK TRANSACTION
  ELSE
  COMMIT TRANSACTION
  在上面的例子中,事务在除了星期二外的每天都递发。假如一个星期中的某一天刚好是星期二,则事务就会倒转回去,不会产生任何效果。换句话说,在在星期二不会收到任何新的定单。
  注意
  在和触发器一起使用时,ROLLBACK TRANSACTION命令特别有用。参看下面的“结合触发器和事务过程”部分。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-299037-1-1.html 上篇帖子: [MSSQL]sql 存储过程定时执行方法 下篇帖子: sql里的update实现多表更新
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表