2016-03-31 107 views
0

我正在使用C#來運行Sql Server存儲過程。我的語法是這樣返回更新記錄數

Update [silly] 
Set [validname] = case 
        when [Name] Not In ('BBABABA', 'SDLJK', 'KJSDJK') 
        Then 'Yes' 
        Else 'No' 
        end 
where [validname] IS NULL 

在被執行時當然會返回5 rows updated或然而,許多行進行了更新。問題的存在,是有我回到我的C#語法多少行與Yes多少行更新,'No'

進行了更新,我使用SQL Server 2008

+0

使用在查詢結束時選擇@@ rowcount並在存儲過程中添加輸出參數 – rashfmnb

+1

@rashfmnb不需要。 [ExecuteNonQuery](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v = vs.110).aspx)*已經*返回該數字。 –

+0

如果您希望按「是」和「否」進行細分,請在更新之前對每一項進行計數,然後將其發送回您的c#代碼。 –

回答

2

如果您使用的是較新的一種方式SQL的版本,你可以使用OUTPUT條款,即會返回一個數據集,你可以指望的行

Update [silly] 
Set [validname] = case 
        when [Name] Not In ('BBABABA', 'SDLJK', 'KJSDJK') 
        Then 'Yes' 
        Else 'No' 
        end 
Output inserted.validname 
where [validname] IS NULL 

編輯

如果你是希望避免在迭代.NET的結果我想你可以將結果輸出到一個臨時表,然後運行中的臨時表的查詢

DECLARE @temp TABLE (
     validname [varchar] NULL 
    ) 

Update [silly] 
Set [validname] = case 
        when [Name] Not In ('BBABABA', 'SDLJK', 'KJSDJK') 
        Then 'Yes' 
        Else 'No' 
        end 
Output inserted.validname into @temp 
where [validname] IS NULL 

SELECT validname, count(*) 
FROM @temp 
GROUP BY validname 
+0

如何從C#中的輸出中讀取值? – RashidInman

+0

這將返回數據集中已更新的結果值,您可以在.net代碼中對其進行計數。 – trouta

+0

在輸出子句上真的很酷的東西!我的答案只是說這個虛構的結果集不是我的Sql服務器產生的......我認爲它沒有實現很好,看到我錯了 – Mzn

0

否,則SQL Server Update語句會返回一個值,這個數字的更新列和它。它不會查看更新語句中的條件/案例。你需要改變你的SP。

您需要更改存儲過程以首先對[Name] not in ('banana', 'strawberry', 'tomatoes')以及那些不滿足此條件的行進行計數。然後你需要執行更新並返回2 OUT參數的計數。

如果需要,換行交易。

PS。如果更新/插入/刪除語句返回或填充臨時表,而不是僅僅返回一些受影響的記錄,那將是很酷的,但事實並非如此(讓我知道是否我錯了:D)

+0

我可以做一個選擇,返回一個計數值,然後運行更新並比較差異在這兩個數字。但是?仍然如何將這些數據返回給我的C# – RashidInman