2012-11-16 64 views
0

我似乎無法找出如何通過以下表達式/子查詢返回的值加載到一個變量:噸SQL - 子查詢成可變

declare @var int 
set @var = null 

    IF @var IS NULL 
SELECT @var = t.col_one 
    FROM my_table t 
    WHERE t_datetime = (SELECT MAX(t_datetime) FROM t WHERE t.col_two = 1) 

我怎樣才能加載表達式的結果進變量?

我已更新代碼以反映下面的答案,但問題仍然存在。有沒有錯誤,但後來在我的sproc時,我打電話@var該變量仍然爲空。這意味着這仍然不起作用。在後面的代碼我使用:

t.col_three = @var 

我不使用t.col_three = @var or @var is null,因爲變量不能爲null進一步:

+0

您是否收到錯誤?如果是這樣?只要子查詢返回一行並且該變量是兼容的數據類型,就應該工作。 –

+0

沒有錯誤。 @var只是不加載/填充結果。 –

+0

查詢是否返回任何值? –

回答

1

嘗試

SELECT @var = table.col from table ... 

還要確保查詢只返回一個行。

例如,添加這樣的事情就在您的查詢之前:

DECLARE @count INT 
SELECT @count = COUNT(*) FROM t WHERE t.col_two = 1 
IF (@count = 0) RAISERROR('no rows found',16,1) 

,看看它是否引發錯誤。

+0

您能否完成代碼「...」我已經使用了select(請參閱我的初始文章中的更新代碼)我仍然無法獲取變量來選擇或設置表達式返回的值。 –

+0

其實我更喜歡A. Agius建議的解決方案,使用top 1和desc命令。如果它仍然不起作用,請進行一些調試以確定是否有任何含t.col_two = 1的行。請參閱上面的編輯。 btw。取決於my_table的大小,您可能應該考慮在t_datetime和col_2列上創建索引。 – Max

0

只要您的查詢只返回一行,SET或SELECT將正常工作。您可以使用MAX等集合函數來確保只有一行,或者您可以選擇TOP 1以確保只返回一行。但是,如果您確實使用TOP 1,請注意也可以通過給予您所需行的方式來排列查詢。

當以這種方式設置一個變量時,我更喜歡只使用TOP 1作爲安全措施 - 像這樣的操作確實在尋找離散值,並且您的查詢也應該以這種方式編寫。

+0

我正在使用MAX來獲取上次更新的記錄。 –

+0

完全同意@D。 Lambert因爲在您的查詢中可能會返回多個記錄。 –

+0

在賦值語句中返回的多個記錄只會導致變量分配多次,除非結果集中最後一條記錄爲空,否則不會導致變量爲空。 –

3

嘗試將查詢更改爲下方。我將在不使用子查詢的情況下實現您所需要的功能,並且與查詢不同,它將始終返回最多1個結果。

Select Top 1 @var = t.col_one 
From my_table t 
Where t.col_two = 1 
Order By t.t_datetime Desc