2014-03-02 32 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將分配給變量返回最後一行的值。