在我没有设置自己的数据库上工作,我正在挖掘一些存储过程以找出它们在做什么。
在这里我发现许多变量是通过 SELECT @var = 设置的,我从来没有真正做过这样的事情并且经常只使用 SET @var =。
阅读文档Microsoft TSQL以及Stackoverflow在我看来它们在功能上相似但不完全相似。
所以我决定用
DECLARE @var1 varchar(200)
SELECT @var1 = 'Generic Name'
SELECT @var1 = (SELECT Name FROM Users)
SELECT @var1 AS 'Company Name'
DECLARE @var2 varchar(30)
SELECT @var2 = 'Generic Name'
SET @var2 = (SELECT Name FROM Users)
SELECT @var2 AS 'Company Name'
DECLARE @var3 varchar(200)
SELECT @var3 = 'Generic Name'
SELECT @var3 = Name FROM Users
SELECT @var3 AS 'Company Name'
DECLARE @var4 varchar(200)
SELECT @var4 = 'Generic Name'
SELECT @var4 = Name FROM Users WHERE Name = '2000'
SELECT @var4 AS 'Company Name'
DECLARE @var5 varchar(200)
SELECT @var5 = 'Generic Name'
SELECT @var5 = (SELECT Name FROM Users WHERE Name = '2000')
SELECT @var5 AS 'Company Name'
根据文档,我希望 var1 具有查询中的最后一个值,并且不会引发错误。但是 var 1 和 var 2 都抛出错误
子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。
上面的结果是基于文档的 set 预期结果,但不是根据我的理解通过 select 分配变量。Var3 确实产生了采用返回的姓氏的预期结果。
同样,var4 和 var5 的行为也很奇怪。这两个查询都不返回结果,所以我希望两者都保留其通用名称的旧值。但是只有 var4 保留了它的旧值。Var5 改为设置为 NULL。我不明白为什么。对我来说,似乎在某些情况下 SELECT @var = 的行为与 SET @var = 完全相同,并且在某些情况下它根据文档进行操作。