给局部变量赋值

Twitter 2008-03-10 01:27:49
之前给定义好的局部变量赋值一直是用 Select 语句,今天看了MSDN,上面说:
“要分配变量,建议使用 SET @local_variable,而不使用 SELECT @local_variable。有关详细信息,请参阅 SET @local_variable。”
但是我查看了Set的相关说明之后,也没有找到为什么最好不用select赋值的原因。
MSDN地址:http://technet.microsoft.com/zh-cn/library/ms187330.aspx

我就想问一下,为什么赋值时,最好使用Set 而不是用Select
...全文
363 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdcopyright 2008-03-11
  • 打赏
  • 举报
回复
有说最好用SET吗?
我知道是SET可以给单个变量赋值,而SELECT可以同时给多个变量。所以一般情况下如果给单个变量赋值用SET,给多个变量赋值用SELECT
rfq 2008-03-10
  • 打赏
  • 举报
回复
set select

感觉对变量赋值时时一样的。
jinjazz 2008-03-10
  • 打赏
  • 举报
回复
换句话说
select id from 部门 where 1=2

select Null不是等价的
fcuandy 2008-03-10
  • 打赏
  • 举报
回复
最简单的一句
SELECT TOP 5 @i=id FROM tb
从这一句就可以直接看出 SELECT 赋值与SET 赋值的区别.
jinjazz 2008-03-10
  • 打赏
  • 举报
回复
我猜测select的开销是大于set的,它一定要从一个数据集中返回列值,而set应该可以直接对变量复制
fcuandy 2008-03-10
  • 打赏
  • 举报
回复
我觉得楼上的比较方法不恰当,请看以下测试.

SELECT @i=id FROM @t WHERE id=99 或者另一个不成立的条件,为什么 @i 不变?
因为 @i 在这里是个递规变量,随着记录集的产生,滚动赋值.
因为 没有符合条件的记录,所以@i没有进行赋值操作,所以它保留原值.


SELECT @i=(SELECT id FROM @t WHERE id=99)
这里得到NULL,因为直接给它赋值,()里得到的就是NULL

而 SET 不支持这种从记录集滚动赋值的操作,所以没有办法进行比较.
从使用上来讲,我觉得二者是一样的,而 SET 从语义上来看更明确,它更"像"是赋值语句.

ms不推荐用select赋值,我觉得应该是因为怕一些对特性不熟的程序员引起误操作.


DECLARE @t TABLE(id INT)
INSERT @t SELECT 55

DECLARE @i INT
SELECT @i= id FROM @t WHERE id=55
SELECT @i
--55

SELECT @i= id FROM @t WHERE id=99
SELECT @i
--55

SET @i=(SELECT id FROM @t WHERE id=99)
SELECT @i
--NULL

SELECT @i= (SELECT id FROM @t WHERE id=99)
SELECT @i
--NULL
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复
--看如下例子可以很容易理解这个问题:

create table test (id int,num int)

insert into test select 1,10
insert into test select 2,20

declare @i int

--存在num=10的数据
select @i = id from test where num=10

select @i

--where条件不满足,但赋值后@i仍旧为1,这是不对的,应该为null
select @i = id from test where num=111

select @i


--以下语句得到的结果是对的,为null
set @i = (select id from test where num=111)

select @i

drop table test


/*


--返回:

1


1


null

*/
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复
--看如下例子可以很容易理解这个问题:

create table test (id int,num int)

insert into test select 1,10
insert into test select 2,20

declare @i int

--存在部门编码='1'的数据
select @i = id from test where num=10

select @i

--where条件永假,但赋值后@i仍旧为1,这是不对的,应该为null
select @i = id from test where num=111

select @i


--以下语句得到的结果是对的,为null
set @i = (select id from test where num=111)

select @i

drop table test


/*


--返回:

1


1


null

*/
jinjazz 2008-03-10
  • 打赏
  • 举报
回复
〉〉select @i = 级别 from 部门 where 1=2

那是因为当前数据集没有返回游标,所以系统无法负值
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复
set 对变量的赋值是通用的,不存在不能赋值的问题
jinjazz 2008-03-10
  • 打赏
  • 举报
回复
应该都没有问题的,可能select在内部实现比set复杂些
pt1314917 2008-03-10
  • 打赏
  • 举报
回复
顶`
Twitter 2008-03-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
原因不好说.

用set可直接赋值.
但一些通过查询的结果要同时赋值的,就得用select了.

如select @var = count(*) from tb
[/Quote]

MSDN上的例子说也可以用SET来查询赋值啊

USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复

declare @i int

--存在部门编码='1'的数据
select @i = 级别 from 部门 where 部门编码='1'

select @i

--where条件永假,但赋值后@i仍旧为1,这是不对的,应该为null
select @i = 级别 from 部门 where 1=2

select @i


--以下语句得到的结果是对的,为null
set @i = (select 级别 from 部门 where 1=2)

select @i


/*


--返回:

1


1


null

*/
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复
对变量的赋值,不建议用select,建议用set

--这样也是对的
set @var = (select count(*) from tb)
dawugui 2008-03-10
  • 打赏
  • 举报
回复
原因不好说.

用set可直接赋值.
但一些通过查询的结果要同时赋值的,就得用select了.

如select @var = count(*) from tb
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复

declare @i int

--存在部门编码='1'的数据
select @i = 级别 from 部门 where 部门编码='1'

select @i

--where条件永假,但赋值后@i仍旧为1,这是不对的,应该为null
select @i = 级别 from 部门 where 1=2

select @i


--以下语句得到的结果是对的,为null
set @i = (select 级别 from 部门 where 1=2)

select @i
OracleRoob 2008-03-10
  • 打赏
  • 举报
回复
应该用set,用select有时会有错误。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧