2014-03-02 37 views
0

首先,我觉得SETSELECT几乎是可以互换的。但是,当我在下面的代码中将SELECT更改为SET时,它无法编译。SET和SELECT命令的交换。

任何人都可以向我解释为什么这样吗?

谢谢。

-- Create Procedure 
CREATE PROCEDURE uspGetAddressCount @City nvarchar(30), @AddressCount int OUT 
AS 
SELECT @AddressCount = count(*) -- changing 'SELECT' to 'SET' doesn't work 
FROM AdventureWorks.Person.Address 
WHERE City = @City 

-- SQL query to call the procedure 
declare @AddressCount int 
exec uspGetAddressCount bothell, @AddressCount OUTPUT 
select @AddressCount -- Didn't know SELECT can be used to print values ? 
+1

“我的印象是SET和SELECT几乎可以互换。”他们不是。你的印象是没有根据的。 –

回答

1
+0

我在发布之前阅读了第一个链接。它指出SET只能分配一个标量值。在这种情况下,count(*)是一个标量值吗?或者,我对标量值的理解是错误的。哎呀。 – iridescent

+1

我可以看到这可能会令人困惑,但正如您在'SET'的文档中所看到的,您不能将其与'FROM'一起使用。 http://technet.microsoft.com/en-us/library/ms189484.aspx –

+0

文档没有明确说明它的正确性? = /。所以必须推断它是不允许的,因为所有示例都在'FROM'语句之前使用'SELECT'。例子'F.虽然,从查询中分配一个值看起来很相似。我也尝试了括号,并没有解决。 – iridescent

0

集用于用于更新变量的值.. 选择用于根据给定的条件显示表格

+0

您也可以使用SELECT将值设置为变量(s)。这就是OP所困惑的地方。 “SET @Variable = 1”和“SELECT @Variable = 1”都是完全合法的。 –

0

尽管其他答案很有帮助,但我不认为他们完全回答了这个问题。这里是如何SET和SELECT都使用句法差异:

SELECT @AddressCount = count(*) 
FROM AdventureWorks.Person.Address WHERE City = @City 

变为:

SET @AddressCount = (SELECT count(*) 
FROM AdventureWorks.Person.Address WHERE City = @City) 

除了语法的另一个重要区别是,如果查询返回超过1行,然后设置将抛出错误,而SELECT将分配给变量返回最后一行的值。