SQLSERVER中SELECT和SET赋值相同点与不同点(推
荐)
SELECT和SET在SQL SERVER中都可以⽤来对变量进⾏赋值,但其⽤法和效果在⼀些细节上有些不同。
1. 在对变量赋值⽅⾯,SET是ANSI标准的赋值⽅式,SELECT则不是。这也是SET⽅式被推荐使⽤的原因之⼀。
2. SELECT可以⼀次对多个变量进⾏赋值,⽽SET⼀次只能对⼀个变量赋值。
DECLARE @NAME NVARCHAR(128), @AGE INT;
SET @NAME = N'⼩明';
SET @AGE=18;
PRINT @NAME;
PRINT @AGE;
GO
DECLARE @NAME NVARCHAR(128), @AGE INT;
SELECT @NAME = N'⼩明',@AGE=18;
PRINT @NAME;
PRINT @AGE;
3.当使⽤⼦查询给变量赋值时,则要求⼦查询必须是标量⼦查询(即⼦查询得到结果是⼀个数据或者⼀⾏⼀列),不能返回多个值,否则会报错。
1)但要注意的是,如果在SELECT查询语句中给变量赋值的时候,查询语句返回记录的多少都不会产⽣错误,变量所得的值是查询语句最后⼀⾏的记录的相应值。
2)如果查询结果没有返回记录,也就是说返回为NULL值时,将整个⼦查询进⾏赋值的⽅式,SET和SELECT都会设置为NULL,⽽在SELECT查询语句中赋值,变量会保持为初始值不受影响。
IF (OBJECT_ID('tempdb..#temp') is not null)
BEGIN
DROP TABLE #temp;
END
ELSE
BEGIN
CREATE TABLE #temp(
[Name] NVARCHAR(128) ,
AGE INT
)
END
GO
INSERT INTO #temp([Name],AGE) VALUES(N'⼩明',18)
INSERT INTO #temp([Name],AGE) VALUES(N'⼩张',19)
INSERT INTO #temp([Name],AGE) VALUES(N'⼩王',17)
GO
DECLARE @NAME1 NVARCHAR(128), @AGE1 INT,@NAME2 NVARCHAR(128), @AGE2 INT;
SET @NAME1=(SELECT TOP 1 [NAME] FROM #temp);  --SET标量在查询赋值
SELECT @AGE1=(SELECT TOP 1 AGE FROM #temp);    --SELECT标量在查询赋值
SELECT @NAME2=[NAME],@AGE2=[AGE] FROM #temp;  --SELECT查询语句中赋值
PRINT @NAME1; --正确运⾏,显⽰结果:⼩明
PRINT @AGE1; --正确运⾏,显⽰结果:18
PRINT @NAME2; --正确运⾏,显⽰结果:⼩王
sql中select是什么意思
PRINT @AGE2; --正确运⾏,显⽰结果:17
GO
DECLARE @NAME1 NVARCHAR(128), @AGE1 INT,@NAME2 NVARCHAR(128), @AGE2 INT;
SELECT @NAME1=N'初始名字',@AGE1=0,@NAME2=N'初始名字',@AGE2=0; --初始化各变量值
SET @NAME1=(SELECT TOP 1 [NAME] FROM #temp WHERE 1>1);  --SET标量在查询赋值
SELECT @AGE1=(SELECT TOP 1 AGE FROM #temp WHERE 1>1);    --SELECT标量在查询赋值
SELECT @NAME2=[NAME],@AGE2=[AGE] FROM #temp WHERE 1>1;  --SELECT查询语句中赋值
PRINT @NAME1; --正确运⾏,实际值:NULL, 显⽰结果:(空⽩)
PRINT @AGE1; --正确运⾏,实际值:NULL, 显⽰结果:(空⽩)
PRINT @NAME2; --正确运⾏,实际和显⽰值:初始名字
PRINT @AGE2; --正确运⾏,实际和显⽰值:0
GO
那么我们该如何选择使⽤哪种⽅式:
1. 因SET作为ANSI的标准,因此其是推荐⽤法。
2. 在不考虑标准的情况下,如果涉及到对多个变量赋值,为了少写代码或者获取多个全局变量的值时,请考虑使⽤SELECT,⼀是因为简便,⼆是⼀些全局变量会在在第⼆句执⾏时值发⽣变化。
总结
以上所述是⼩编给⼤家介绍的SQL SERVER中SELECT和SET赋值相同点与不同点,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。