2012-04-30 83 views
6

我的代碼如下:如何在IF語句以及BEGIN..END塊中使用@@ ROWCOUNT?

SET @var = (SELECT var FROM dbo.varDB WHERE varName = @varName) 

IF (@@ROWCOUNT > 0) 
    BEGIN 
     //carry out insert 
    END 

難道我說錯這將始終返回爲@@ ROWCOUNT因爲它進行賦值持續多久?

如果是這樣,這將是最完美的解決方案,讓我:

  • 從我的查詢存儲在它
  • 測試結果創建變量如果查詢返回任何結果
+2

你有沒有嘗試過上述設置語句時有0,1和多個匹配的行? –

回答

8

它返回一個原因是因爲你一個值(一些任意值)來分配。正如@Sive所建議的那樣,您應該使用EXISTS而不是手動計數。原因是EXISTS不會比COUNT表現得更差,而在您描述的用例中,無論如何,實際的計數並不重要。你想知道計數是零還是大於零。

如果存在多個匹配的行,將該值賦值給變量的方式會出現什麼問題?讓我們試一下:

DECLARE @foo TABLE([var] INT, varname SYSNAME); 
INSERT @foo VALUES (1,N'bob'),(2,N'bob'); 
DECLARE @var INT; 
SET @var = (SELECT [var] FROM @foo WHERE varname = N'bob 

結果:

消息512,級別16,狀態1,4號線
子查詢返回多個1個 值。當子查詢遵循=時,這是不允許的!=,<,< =,>,> =或者當子查詢用作表達式時。現在

,如果varname是獨一無二的,我這樣做:

SELECT @var = [var] FROM dbo.varDB WHERE varName = @varName; 
IF @var IS NOT NULL 
BEGIN 
    // carry out insert 
END 
ELSE 
BEGIN 
    PRINT 'Already existed! ' + RTRIM(@var); 
END 

如果varname唯一的,那麼我不知道你要與一個值做什麼。哪一個拉?試想一下這種情況:

DECLARE @foo TABLE([var] INT, varname SYSNAME); 
INSERT @foo VALUES (3,N'bob'),(2,N'adam'),(1,N'bob'); 
DECLARE @var INT; 
SELECT @var = [var] FROM @foo WHERE varname = N'bob'; 
PRINT @var; 

請問@var是1還是3?誰知道?如果你只捕獲潛在的許多價值之一,爲什麼它是一個問題呢?你打算在那一行做些什麼,但不是其他的?

此外,如果你的目的是從該表中插入數據,爲什麼不乾脆扔掉的前期檢查中,行數等,只是說:

INSERT dbo.SomeTable(column1 --,...other columns 
    SELECT var --,...other columns 
    FROM dbo.varDB 
    WHERE varName = @varName; 

插入不會如果該行不存在,則會發生。

5

你可以使用EXISTS來做類似的事情。這將檢查是否至少有一條記錄存在於@varName中的給定值,然後再執行包含在BEGINEND之間的陳述。

腳本

IF EXISTS (SELECT var FROM dbo.varDB WHERE varName = @varName) 
    BEGIN 
     //carry out insert 
    END 

MSDN文檔:基於評論EXISTS (Transact-SQL)

,更新#1:

我不明白,知道的價值要求。我想你可能想使用COUNT,如果你想獲取計數。

DECLARE @recordsCount 
SELECT @recordsCount = COUNT(var) FROM dbo.varDB WHERE varName = @varName 

IF recordsCount > 0 
BEGIN 
    // your statements 
END 

根據意見,更新#2:

如果你想使用結果集本身內部的BEGIN和END,那麼問題就需要了解如何在結果集將內部使用的詳細信息聲明。基於進一步的投入,可能你甚至不需要IF聲明。進一步的細節需要爲您的問題提供清晰的解決方案。

+0

然後,我將如何訪問IF語句中的查詢返回的結果? –

+0

你爲什麼在乎實際的數量是多少?難道你只關心是否已經有至少一行或零行?如果它返回1,2或3,你會做什麼不同的事情? –

+0

我只需要知道(a)是否存在值和(b)返回值是什麼。 –

3

您可以選擇和測試返回的行數:

SELECT @var = var FROM dbo.varDB WHERE varName = @varName 
IF (@@ROWCOUNT > 0) 
BEGIN 
    //carry out insert 
END 
+1

@ p.campbell不正確。請試試這個:'declare @x int 從someaTable中選擇@x = null,其中1 = 0 print @@ rowcount'。顯然,把桌子改成你的桌子。 –

+1

@ p.campbell你介意取消你的downvote嗎? –

+1

取而代之。剛剛在編輯後看到您的帖子。 –

5

您可以將您的變量設置爲NULL(只是爲了確保)。

如果您的查詢沒有返回任何行,@var仍然是NULL
如果它返回一行,@var將有一個值
如果它返回多個行,您將有一個例外。

SET @var = NULL 

SET @var = (SELECT var FROM dbo.varDB WHERE varName = @varName) 
IF @var IS NOT NULL 
BEGIN 
//carry out insert 
END 

更新

如果你真的想使用@@ROWCOUNT相反,您可以使用select代替set分配你的價值。

SELECT @var = var FROM dbo.varDB WHERE varName = @varName 
IF (@@ROWCOUNT > 0) 
BEGIN 
//carry out insert 
END 
+3

如果'var'的選定值碰巧是'NULL'會怎麼樣? – HABO

+1

@ user92546這就是爲什麼我認爲將insert和select組合成一個操作更安全的原因。但是西瓦是對的,這個問題需要澄清,因爲人們已經花時間在這個簡單的解決方案上花費了大量的時間。 –

+1

如果OP想要用NULL值做某件事,這是行不通的。 –