51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2519|回复: 1
打印 上一主题 下一主题

[原创] set 和select在定义变量时的不同

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-12-23 12:54:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
declare @x int, @y int
select  @x =1,@y =2 --------如果我在这把select改成set行不行,为什么?if @x>@y
print 'x>y'
else
print 'x<y'
go
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2018-2-28 18:04
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]测试团长

    2#
    发表于 2008-12-25 11:20:58 | 只看该作者
    貌似是sql语句。
    读下这个。。

    原文:http://www.chinadba.cn/doc5.htm     
      

    SQL   Server   中对已经定义的变量赋值的方式用两种,分别是   SET   和   SELECT。
    对于这两种方式的区别,SQL   Server   联机丛书中已经有详细的说明,但很多时候我们
    并没有注意,其实这两种方式还是有很多差别的。

    SQL   Server推荐使用   SET   而不是   SELECT   对变量进行赋值。
    当表达式返回一个值并对一个变量进行赋值时,推荐使用   SET   方法。

    下表列出   SET   与   SELECT   的区别。请特别注意红色部分。   

        set   select   
    同时对多个变量同时赋值   不支持   支持   
    表达式返回多个值时   出错   将返回的最后一个值赋给变量   
    表达式未返回值   变量被赋null值   变量保持原值   

    下面以具体示例来说明问题:

    create   table   chinadba1(
    userid   int   ,
    addr   varchar(128)   
    )
    go
    insert   into   chinadba1(userid,addr)   values(1, 'addr1 ')
    insert   into   chinadba1(userid,addr)   values(2, 'addr2 ')
    insert   into   chinadba1(userid,addr)   values(3, 'addr3 ')
    go


    表达式返回多个值时,使用   SET   赋值   

    declare   @addr   varchar(128)
    set   @addr   =   (select   addr   from   chinadba1)
    /*
    --出错信息为
    服务器:   消息   512,级别   16,状态   1,行   2
    子查询返回的值多于一个。当子查询跟随在   =、!=、 <、 <=、> 、> =   之后,或子查询用作表达式时,这种情况是不允许的。
    */
    go

    表达式返回多个值时,使用   SELECT   赋值   
    declare   @addr   varchar(128)
    select   @addr   =   addr   from   chinadba1
    print   @addr   --结果集中最后一个   addr   列的值
    --结果:   addr3   
    go


    表达式未返回值时,使用   SET   赋值   
    declare   @addr   varchar(128)
    set   @addr   =   '初始值 '
    set   @addr   =   (select   addr   from   chinadba1   where   userid   =   4   )
    print   @addr   --null值   
    go


    表达式未返回值时,使用   SELECT   赋值   
    declare   @addr   varchar(128)
    set   @addr   =   '初始值 '
    select   @addr   =   addr   from   chinadba1   where   userid   =   4
    print   @addr   --保持原值
    go


    需要注意的是,SELECT   也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为   null   值。
    此时与   使用   SET   赋值是完全相同的
    对标量子查询的概念大家应该都觉得陌生,举个例子就能说明

    declare   @addr   varchar(128)
    set   @addr   =   '初始值 '
    --select   addr   from   chinadba1   where   userid   =   4   为标量子查询语句
    select   @addr   =   (select   addr   from   chinadba1   where   userid   =   4)   
    print   @addr   --null值
    go
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-11 05:23 , Processed in 0.060775 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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