Почему мы используем SET NOCOUNT ON;вместе с SELECT @@ ROWCOUNT ;? - PullRequest
1 голос
/ 11 ноября 2019

Я учусь через EF Core через учебники по здесь , и я сталкиваюсь со следующими утверждениями, которые используются в примерах запросов T-SQL:

1 SET NOCOUNT ON;Значение (от здесь ):

Останавливает возвращение в качестве части сообщения количества строк, затронутых оператором Transact-SQL или хранимой процедурой. набор результатов.

2 SELECT @@ROWCOUNT; Значение (от здесь )

Возвращает количество строк, затронутых последним оператором.

1 и 2 используются одновременно. И это смущает меня. Например, здесь:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Books] SET [AuthorId] = @p0
WHERE [BookId] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 int',@p1=4,@p0=1

Я не могу понять, почему кто-то хочет отключить эффект 2 с помощью 1, если можно избежать эффекта 2, просто не добавляяэто в запрос. Т.е. следующий запрос будет выполняться точно так же, как и выше:

exec sp_executesql N'UPDATE [Books] SET [AuthorId] = @p0
WHERE [BookId] = @p1;
',N'@p1 int,@p0 int',@p1=4,@p0=1

Я что-то здесь упускаю или для чего нужно одновременно использовать SET NOCOUNT ON и SELECT @@ROWCOUNT?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2019

SET NOCOUNT ON останавливает вывод результатов на консоли (экран).

Использование @@ROWCOUNT захватывает количество строк в качестве параметра в T-SQL и создаетможно использовать его для дальнейшей обработки. Например, вы можете иметь условную логику, чтобы что-то делать, если не обновляются строки.

2 голосов
/ 12 ноября 2019

SET NOCOUNT часто используется для подавления сообщений протокола DONE_IN_PROC TDS (количество строк), в противном случае SQL Server возвращал бы клиенту через базовый поток протокола TDS. Эти сообщения могут вызывать проблемы при использовании некоторых API-интерфейсов SQL Server, если только приложение не кодируется специально для их обработки (например, путем вызова ADODB.Recordset.NextRecordSet), чтобы гарантировать выполнение последующих операторов в пакете и возвращение наборов результатов. Следовательно, использование SET NOCOUNT ON стало обычной практикой в ​​SQL Server, если только количество строк фактически не требуется приложению.

Дополнительное преимущество, упомянутое в справочной документации по вашему вопросу, - это повышение производительностив случаях, когда пакет содержит много операторов SQL. SET NOCOUNT устраняет накладные расходы по возврату сообщений, которые все равно будут отброшены.

...