转载文章:http://blog.csdn.net/perddy/article/details/4033406
select和set都可以对(使用 DECLARE @local_variable 创建的)局部变量进行赋值,但二者又有显著区别。
SqlServer建议将 SET @local_variable 而不是 SELECT @local_variable 用于变量赋值
语法:
SELECT { @local_variable = expression
} [ ,...n ]
SET { { @local_variable = expression
}
| { @cursor_variable =
{@cursor_variable
| cursor_name
| { CURSOR [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [
,...n ] ] }
]
}
} }
}
注释:
操作 | select | set |
(1)同时对多个变量赋值 | 不支持 | 支持 |
(2)表达式返回多个值 | 把结果集的最后一行值赋给变量 | 错误 |
(3)表达式不返回值 | 保留变量的原来值(但如果表达式是不返回值的标量子查询,那么赋给变量的值为NULL) | NULL |
表格中的(1)和(2)不难理解,下面对(3)进行举例说明
- declare @a varchar(50)
- set @a='hello'
- select @a=t1 from table1 where 1=2
因为select表达式没有返回值,所以此时@a的为‘hello’,也就是变量的原值。
但如果换成标量子查询,再看看结果
- declare @a varchar(50)
- set @a='hello'
- select @a=(select top 1 t1 from table1 where 1=2)
此时@a的值就为NULL,如果把上面语句的select换成set,结果是一样的。
- declare @a varchar(50)
- set @a='hello'
- set @a=(select top 1 t1 from table1 where 1=2)
@a的值为NULL。
结论:
(1)如果是对单个变量赋值,建议采用set
(2)如果对多个变量赋值,使用select