2016-03-31 4 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

use выберите @@ 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 

EDIT

Если вы глядя, чтобы избежать переборе результатов в .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

Нет, оператор Update SQL Server будет возвращать одно значение, число обновленных столбцов и что это. Он не будет рассматривать условие/случаи в вашем заявлении об обновлении. Вам нужно изменить свой SP.

Вам необходимо изменить хранимую процедуру, чтобы сначала подсчитать строки с помощью [Name] not in ('banana', 'strawberry', 'tomatoes') и тех, которые не удовлетворяют этому условию. Затем вам нужно выполнить обновление и вернуть в качестве 2 параметров OUT счетчики.

Оберните сделку, если потребуется.

PS. было бы здорово, если бы инструкции update/insert/delete возвращались или заполняли временную таблицу вместо того, чтобы просто возвращать несколько затронутых записей, но это не так (дайте мне знать, если я ошибаюсь: D)

+0

Я мог бы сделать выбор, который возвращает количество доступных, затем запустите обновление и сравните разницу в двух пунктах. Но ? остается, как вернуть эти данные на мой C# – RashidInman

Смежные вопросы