Set nocount on что это
Перейти к содержимому

Set nocount on что это

  • автор:

SQL-Ex blog

На прошлой неделе я пересматривал статью и обнаружил, что мне нужна инфомация об использовании NOCOUNT в качестве стандартного средства при написании хранимых процедур. Быстрый поиск в интернете нашел мою старую статью. Видимо, меня спросили, можно ли включить NOCOUNT для конкретной базы данных SQL Server. Как предполагалось в статье, это не было возможным. Опция NOCOUNT устанавливается для всего экземпляра, для конкретного подключения или в коде T-SQL.

Поскольку эта статья была написана задолго до появления новейшего оператора ALTER DATABASE SCOPED CONFIGURATION, я понадеялся, что теперь стало возможным включить NOCOUNT для базы данных. Оказалось, что нет, т.к. перечисленные здесь допустимые опции не включают NOCOUNT. Печально.

Но, конечно, я все же попытался.

Но мне не удалось.

На самом деле не удалось.

Я попытался включить NOCOUNT для моего экземпляра SQL 2019, и никак. Вообще.

Провал

Используя код из моей предыдущей статьи, вы можете включить NOCOUNT для экземпляра, установив user option в 512:

EXEC sys.sp_configure 'user options','512' 
GO
RECONFIGURE
GO

Теперь откройте новое окно запроса в SQL Server Management Studio (SSMS), установите вывод результатов в тексте, чтобы проще их просматривать, и выполните запрос. Тогда вы увидите это:

Это не то поведение, которое ожидалось! Моей первой реакцией было, что я что-то не так сделал. Я решил попробовать в Azure Data Studio (ADS), подключившись и выполнив запрос:

Тот же результат. Два инструмента, и результирующий набор показывает число обработанных строк, несмотря на явно установленную пользовательскую опцию.

И графический интерфейс SSMS также подтверждает это:

Поворот

Прежде чем двигаться дальше, я хочу отметить, что SET NOCOUNT OFF — одна из тех ужасных фраз, с которыми мы сталкиваемся в сфере технологий, когда наш мозг вынужден дважды думать о том, что мы делаем. Следует уволить того, кто так его назвал. Простое SET ROWRESULTS ON|OFF было бы значительно проще и понятней.

Как бы то ни было, я потратил время, пытаясь выяснить, что происходит. Я могу вручную включить и выключить NOCOUNT внутри T-SQL и увидеть число обработанных строк (или нет). Я проверял и перепроверял все, что приходило мне в голову, и чувствовал себя потерявшим рассудок. Я начал спрашивать себя, как мне удалось стать сертифицированным специалистом в SQL Server.

Я имею в виду, что это простое изменение конфигурации. Это не ракетная техника.

Поэтому я делаю то, что сделал бы любой другой в этой ситуации.

Я выключил свой ноут и выбросил это из головы на несколько дней.

Река

В конце концов я решил снова открыть ноут попытаться опять. Я могу все воспроизвести. Поэтому я обратился к нескольким друзьям, наблюдали ли они также подобные проблемы. Один из них, Karen López (@datachick), задал мне несколько наводящих вопросов. Эти вопросы заставили меня подумать о других способах проверки. Я внезапно понял, что могу проверить опции, установленные в моем текущем подключении:

DECLARE @options INT 
SELECT @options = @@OPTIONS
PRINT @options
IF ( (1 & @options) = 1 ) PRINT 'DISABLE_DEF_CNST_CHK'
IF ( (2 & @options) = 2 ) PRINT 'IMPLICIT_TRANSACTIONS'
IF ( (4 & @options) = 4 ) PRINT 'CURSOR_CLOSE_ON_COMMIT'
IF ( (8 & @options) = 8 ) PRINT 'ANSI_WARNINGS'
IF ( (16 & @options) = 16 ) PRINT 'ANSI_PADDING'
IF ( (32 & @options) = 32 ) PRINT 'ANSI_NULLS'
IF ( (64 & @options) = 64 ) PRINT 'ARITHABORT'
IF ( (128 & @options) = 128 ) PRINT 'ARITHIGNORE'
IF ( (256 & @options) = 256 ) PRINT 'QUOTED_IDENTIFIER'
IF ( (512 & @options) = 512 ) PRINT 'NOCOUNT'
IF ( (1024 & @options) = 1024 ) PRINT 'ANSI_NULL_DFLT_ON'
IF ( (2048 & @options) = 2048 ) PRINT 'ANSI_NULL_DFLT_OFF'
IF ( (4096 & @options) = 4096 ) PRINT 'CONCAT_NULL_YIELDS_NULL'
IF ( (8192 & @options) = 8192 ) PRINT 'NUMERIC_ROUNDABORT'
IF ( (16384 & @options) = 16384 ) PRINT 'XACT_ABORT'

Выполнение вышеприведенного кода вернуло следующий результат для моего подключения:

И тут меня осенило. Мое подключение не имело включенного NOCOUNT! Я не хочу сказать, что был сильно удивлен, но это помогло увидеть, что отсутствует. Я решил открыть подключение с помощью SQLCMD и посмотреть на поведение по умолчанию для этого подключения. Разумеется, NOCOUNT включен, как и ожидалось:

Моя строка подключения не имела дополнительных опций, и поведение NOCOUNT соблюдается. Это ожидаемое поведение для экземпляра.
Теперь мне нужно проверить, что происходит под капотом при подключении к SQL Server с использованием SSMS или ADS. Используя сессию по умолчанию xEvents, я захватил строку подключения, переданную при подключении из ADS, и нашел эту драгоценность:

Пункт конфигурации NOCOUNT в опциях пользователя не распознается при подключении с помощью этих инструментов. Другие опции по-видимому соответствуют, но по неведомым причинам NOCOUNT игнорируется. Это объясняет, почему я наблюдал неожиданное поведение.

Пока оставлю свой сертификат.

Выводы

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

Не важно, как подключаются пользователи. SSMS и ADS должны соответствовать настройкам сервера. Я подозреваю, что другие инструменты, вероятно, используют тот же код, что и SSMS и ADS, а это означает, что вам следует дважды проверить фактическую строку подключения, используемую в вашем приложении. Это могло бы объяснить неожиданное поведение.

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Оптимизация хранимых процедур в SQL Server

Доброго дня, хабрачеловек. Сегодня я бы хотел обсудить с вами тему хранимых процедур в SQL Server 2000-2005. В последнее время их написание занимало львиную долю моего времени на работе и чего уж тут скрывать – по окончанию работы с этим делом осталось достаточно информации, которой с удовольствием поделюсь с тобой %пользовательимя%.
Знания, которыми я собираюсь поделиться, к сожалению,(или к счастью) не добыты мной эмперически, а являются, в большей степени, вольным переводом некоторых статей из буржуйских интернетов.
Итак, как можно понять из названия речь пойдет об оптимизации. Сразу оговорюсь, что все действия, которые я сейчас буду описывать, действительно дают существенный(некоторые больший, некоторые меньший) прирост производительности.
Данная статья не претендует на полное раскрытие темы оптимизации, скорее это собрание практик, которые я применяю в своей работе и могу ручаться за их эффективность. Поехали!

1. Включай в свои процедуры строку — SET NOCOUNT ON: С каждым DML выражением, SQL server заботливо возвращает нам сообщение содержащее колличество обработанных записей. Данная информация может быть нам полезна во время отладки кода, но после будет совершенно бесполезной. Прописывая SET NOCOUNT ON, мы отключаем эту функцию. Для хранимых процедур содержащих несколько выражений или\и циклы данное действие может дать значительный прирост производительности, потому как колличество трафика будет значительно снижено.

CREATE PROC dbo.ProcName
AS
SET NOCOUNT ON;
—Здесь код процедуры
SELECT column1 FROM dbo.TblTable1
—Перключение SET NOCOUNT в исходное состояние
SET NOCOUNT OFF;
GO

2. Используй имя схемы с именем объекта: Ну тут думаю понятно. Данная операция подсказывает серверу где искать объекты и вместо того чтобы беспорядочно шарится по своим закромам, он сразу будет знать куда ему нужно пойти и что взять. При большом колличестве баз, таблиц и хранимых процедур может значительно сэкономить наше время и нервы.

SELECT * FROM dbo.MyTable —Вот так делать хорошо
— Вместо
SELECT * FROM MyTable —А так делать плохо
—Вызов процедуры
EXEC dbo.MyProc —Опять же хорошо
—Вместо
EXEC MyProc —Плохо!

3. Не используй префикс «sp_» в имени своих хранимых процедур: Если имя нашей процедуры начинается с «sp_», SQL Server в первую очередь будет искать в своей главной базе данных. Дело в том, что данный префикс используется для личных внутренних хранимых процедур сервера. Поэтому его использование может привести к дополнительным расходам и даже неверному результату, если процедура с таким же имененем как у вас будет найдена в его базе.

4. Используй IF EXISTS (SELECT 1) вместо IF EXISTS (SELECT *): Чтобы проверить наличие записи в другой таблице, мы используем выражение IF EXISTS. Данное выражение возвращает true если из внутреннего выражения возвращается хоть одно изначение, не важно «1», все колонки или таблица. Возращаемые данные, в принципе никак не используются. Таким образом для сжатия трафика во время передачи данных логичнее использовать «1», как показано ниже:

IF EXISTS (SELECT 1 FROM sysobjects
WHERE name = ‘MyTable’ AND type = ‘U’)

5. Используй TRY-Catch для отлова ошибок: До 2005 сервера после каждого запроса в процедуре писалось огромное колличество проверок на ошибки. Больше кода всегда потребляет больше ресурсов и больше времени. С 2005 SQL Server’ом появился более правильный и удобный способ решения этой проблемы:

BEGIN TRY
—код
END TRY
BEGIN CATCH
—код отлова ошибки
END CATCH

Заключение
В принципе на сегодня у меня всё. Еще раз повторюсь, что здесь лишь те приёмы, которые использовал лично я в своей практике, и могу ручаться за их эффективность.

P.S.
Мой первый пост, не судите строго.

SET NOCOUNT ON statement usage and performance benefits in SQL Server

Include Client Statistics with SET NOCOUNT ON

Include Client Statistics with SET NOCOUNT ON

Have you ever noticed SET NOCOUNT ON statement in T-SQL statements or stored procedures in SQL Server? I have seen developers not using this set statement due to not knowing it. In this article, we will explore why it is a good practice to use SET NOCOUNT ON with T-SQL statements. We will also learn the performance benefit you can get from it.

Introduction

Before we explore this statement, let’s create a sample table in the SQL Server database with the following script.

USE SQLShackDemo ;
CREATE TABLE tblEmployeeDemo
PRIMARY KEY ,
EmpName NVARCHAR ( 50 ) ,
Gender NVARCHAR ( 10 ) ,
Let’s insert a few records data in this table using the following script.
USE [ SQLShackDemo ]

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 1 , N ‘Grace’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 2 , N ‘Gordon’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 3 , N ‘Jaime’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 4 , N ‘Ruben’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 5 , N ‘Makayla’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 6 , N ‘Barry’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 7 , N ‘Ramon’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 8 , N ‘Douglas’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 9 , N ‘Julian’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 10 , N ‘Sarah’ , N ‘Female’ )

The output

Once you execute the command, you get the following message in SSMS. You get ‘1-row affected’ message for each row. Suppose you insert a million rows in the table and for each record, you get this message. As you can see, it is not a useful message and does not provide relevant information. Now, let’s select the records from this table.

FROM tblEmployeeDemo ;

  • Result tab shows the record from the table
  • The messages tab gives the number of rows affected message

Result and message tab in SSMS

Let’s create a stored procedure to get the records from the specified table.

CREATE PROCEDURE SP_tblEmployeeDemo
FROM tblEmployeeDemo ;

Execute this stored procedure, and you get a similar output in the following screenshot as well.

Exec SP_tblEmployeeDemo

Output of a stored procedure in the results and message tab

SET NOCOUNT ON/OFF statement controls the behavior in SQL Server to show the number of affected rows in the T-SQL query.

  • SET NOCOUNT OFF – By default, SQL Server shows the number of affected rows in the messages pane
  • SET NOCOUNT ON – We can specify this set statement at the beginning of the statement. Once we enable it, we do not get the number of affected rows in the output

Let’s try running the previous queries with NOCOUNT statement.

    Execute the insert statement after enabling the NOCOUNT

TRUNCATE TABLE tblEmployeeDemo ;
SET NOCOUNT ON
USE [ SQLShackDemo ]

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 1 , N ‘Grace’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 2 , N ‘Gordon’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 3 , N ‘Jaime’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 4 , N ‘Ruben’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 5 , N ‘Makayla’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 6 , N ‘Barry’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 7 , N ‘Ramon’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 8 , N ‘Douglas’ , N ‘Male’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 9 , N ‘Julian’ , N ‘Female’ )

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 10 , N ‘Sarah’ , N ‘Female’ )

Effect of SET NOCOUNT ON

Once we execute the above queries we do not get messages of 1 row(s) affected. It gives the following message.
Execute the Select statement with NOCOUNT ON, and you get the following output

SET NOCOUNT ON
FROM tblEmployeeDemo ;

Effect of NOCOUNT messages on select statement

Similar to the insert statement, we did not get the number of rows affected message in the select statement output.
Execute Stored procedure We cannot directly execute the stored procedure with the SET NOCOUNT ON statement. The above statement does not work on the stored procedure.

SET NOCOUNT ON
Exec SP_tblEmployeeDemo

We either need to create a new stored procedure or alter the procedure and add the SET NOCOUNT statement as per the following script.

ALTER PROCEDURE SP_tblEmployeeDemo
SET NOCOUNT ON ;
FROM tblEmployeeDemo ;

Execute the stored procedure, and we get the required output without the number of affected rows message.

Exec SP_tblEmployeeDemo

Impact of SET NOCOUNT ON with the stored procedure

Configure the behavior of NOCOUNT at instance level

The SET NOCOUNT ON works at the session-level. We need to specify it with each session. In the stored procedures, we specify the code itself. Therefore, it does not require specifying explicitly in the session.

We can use the sp_configure configuration option to use it at the instance level. The following query sets the behavior of SET NOCOUNT ON at the instance level.

EXEC sys . sp_configure ‘user options’ , ‘512’ ;
RECONFIGURE

If we specify the NOCOUNT ON/OFF in the individual session, we can override the behavior configured at the instance level.

SET NOCOUNT and @@ROWCOUNT function

We can use the @@ROWCOUNT function to get the number of affected rows in SQL Server. The NOCOUNT ON function does not have any impact on the @@ROWCOUNT function.

Execute the following query, and we get the number of rows affected with the Insert statement.

TRUNCATE TABLE tblEmployeeDemo ;
USE [ SQLShackDemo ]
SET NOCOUNT ON

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 1 , N ‘Grace’ , N ‘Female’ ) , ( 2 , N ‘Gordon’ , N ‘Male’ )

Select @ @ ROWCOUNT as rowsaffected

SET NOCOUNT and @@ROWCOUNT function

SET NOCOUNT ON and the SQL Trigger

Let’s check the impact of the NOCOUNT statement on the SQL Triggers.

The following command inserts two records in the tblEmployeeDemo table.

TRUNCATE TABLE tblEmployeeDemo ;
USE [ SQLShackDemo ]
SET NOCOUNT ON

INSERT [ dbo ] . [ tblEmployeeDemo ] ( [ Id ] , [ EmpName ] , [ Gender ] ) VALUES ( 1 , N ‘Grace’ , N ‘Female’ ) , ( 2 , N ‘Gordon’ , N ‘Male’ )

Select @ @ ROWCOUNT as rowsaffected

Create another table to store the record transaction records inserted using the trigger.

CREATE TABLE Audit_tblEmployee
( UpdatedID INT ,
UpdatedValue NVARCHAR ( 10 ) ,
Audit_Timestamp DATETIME default getdate ( )

Let’s create a SQL INSERT, Update trigger to capture the records for the insert, update values.

CREATE TRIGGER TR_tblEmployeeDemo ON dbo . tblEmployeeDemo
AFTER INSERT , UPDATE
INSERT INTO Audit_tblEmployee
UpdatedValue
SELECT i . ID ,
FROM inserted AS i ;

Execute the following query to update an existing value in the tblEmployeeDemo table, and it invokes the SQL trigger for inserting record in the Audit_tblEmployee table.

Update tblEmployeeDemo set Gender = ‘Male’ where ID = 1

The update statement updates only one record; however, in the following SSMS message, it shows two rows affected.

Trigger issue

It might create issues for us if the further code depends upon the number of rows affected message. We get this message due to update record tblEmployeeDemo and insert record in the Audit_tblEmployee table.

We do not want the result ‘ 1 row affected’ for the data insertion in the audit table. We should use the trigger with SET NOCOUNT ON for suppressing this message.

Let’s alter the trigger with the following script:

alter TRIGGER TR_tblEmployeeDemo ON dbo . tblEmployeeDemo
AFTER INSERT , UPDATE
SET NOCOUNT ON
INSERT INTO Audit_tblEmployee
UpdatedValue
SELECT i . ID ,
FROM inserted AS i ;

Rerun the update statement, and we get the expected result and get only the number of affected rows using the update statement.

SET NOCOUNT impact on the trigger output

The Performance impact of NOCOUNT statement

According to Microsoft documentation, using NOCOUNT option can provide a significant performance improvement.

Microsoft Documentation

Let’s explore this performance benefit with the following example.

Create two different stored procedures with different NOCOUNT properties.

    Create a stored procedure with default behavior ( NOCOUNT OFF)

CREATE PROC NOCountTest ( @ N INT )
DECLARE @ NumberofRecords INT ;
SET @ NumberofRecords = 0 ;
WHILE @ NumberofRecords < @ N SET @ NumberofRecords = @ NumberofRecords + 1 ; CREATE PROC NOCountTest_ON ( @ N INT ) SET NOCOUNT ON DECLARE @ NumberofRecords INT ; SET @ NumberofRecords = 0 ; WHILE @ NumberofRecords < @ N SET @ NumberofRecords = @ NumberofRecords + 1 ; SELECT @ NumberofRecords

Execute both the stored procedures with the different number of rows 1000, 10000, 100000 and 1000000. We want to capture client statistics for these executions. In the query window of SSMS, go to Edit and enable the Include Client Statistics.

Include Client Statistics

Let’s compare the client statistics

  • with SET NOCOUNT OFF Include Client Statistics with default SQL behaviour
  • With SET NOCOUNT ON Include Client Statistics with SET NOCOUNT ON

Let’s put both screenshots of client statistics together to see a difference

Comparison of client statistics

We can see a huge difference in the TDS packagers received from the server, Bytes received from the server and the client processing time. The number of the select statement also shows a significant improvement. We did not specify the Select statement in the stored procedure, but still, SQL Server treats SET statement as a select statement with the default NOCOUNT value. We can reduce the network bandwidth with the SET NOCOUNT ON option in the stored procedures or T-SQL statements. It might not improve the query performance drastically, but definitely, it puts an impact on the processing time, reducing the network bandwidth and client processing times.

Conclusion

In this article, we explored the behavior of T-SQL statements and stored procedures using the SET NOCOUNT ON. We should consider this SET option and eliminate unnecessary messages to reduce network traffic and improve performance.

Hi! I am Rajendra Gupta, Database Specialist and Architect, helping organizations implement Microsoft SQL Server, Azure, Couchbase, AWS solutions fast and efficiently, fix related issues, and Performance Tuning with over 14 years of experience.

I am the author of the book «DP-300 Administering Relational Database on Microsoft Azure». I published more than 650 technical articles on MSSQLTips, SQLShack, Quest, CodingSight, and SeveralNines.

I am the creator of one of the biggest free online collections of articles on a single topic, with his 50-part series on SQL Server Always On Availability Groups.

Based on my contribution to the SQL Server community, I have been recognized as the prestigious Best Author of the Year continuously in 2019, 2020, and 2021 (2nd Rank) at SQLShack and the MSSQLTIPS champions award in 2020.

Personal Blog: https://www.dbblogger.com
I am always interested in new challenges so if you need consulting help, reach me at rajendra.gupta16@gmail.com

Latest posts by Rajendra Gupta (see all)

  • How to install PostgreSQL on Ubuntu — July 13, 2023
  • How to use the CROSSTAB function in PostgreSQL — February 17, 2023
  • Learn the PostgreSQL COALESCE command — January 19, 2023

Related posts:

  1. Static Data Masking in SSMS 18
  2. Term Extraction Transformation in SSIS
  3. What to choose when assigning values to SQL Server variables: SET vs SELECT T-SQL statements
  4. Qué elegir al asignar valores a las variables de SQL Server: sentencias SET vs SELECT T-SQL
  5. CASE statement in SQL

About Rajendra Gupta

Hi! I am Rajendra Gupta, Database Specialist and Architect, helping organizations implement Microsoft SQL Server, Azure, Couchbase, AWS solutions fast and efficiently, fix related issues, and Performance Tuning with over 14 years of experience. I am the author of the book «DP-300 Administering Relational Database on Microsoft Azure». I published more than 650 technical articles on MSSQLTips, SQLShack, Quest, CodingSight, and SeveralNines. I am the creator of one of the biggest free online collections of articles on a single topic, with his 50-part series on SQL Server Always On Availability Groups. Based on my contribution to the SQL Server community, I have been recognized as the prestigious Best Author of the Year continuously in 2019, 2020, and 2021 (2nd Rank) at SQLShack and the MSSQLTIPS champions award in 2020. Personal Blog: https://www.dbblogger.com I am always interested in new challenges so if you need consulting help, reach me at rajendra.gupta16@gmail.com View all posts by Rajendra Gupta

Follow us!

Popular

  • SQL Convert Date functions and formats
  • SQL Variables: Basics and usage
  • SQL PARTITION BY Clause overview
  • Different ways to SQL delete duplicate rows from a SQL Table
  • How to UPDATE from a SELECT statement in SQL Server
  • How to backup and restore MySQL databases using the mysqldump command
  • SELECT INTO TEMP TABLE statement in SQL Server
  • Overview of SQL RANK functions
  • Understanding the SQL MERGE statement
  • SQL Server table hints – WITH (NOLOCK) best practices
  • SQL Server functions for converting a String to a Date
  • SQL WHILE loop with simple examples
  • Understanding the SQL Decimal data type
  • CASE statement in SQL
  • SQL multiple joins for beginners with examples
  • The Table Variable in SQL Server
  • DELETE CASCADE and UPDATE CASCADE in SQL Server foreign key
  • INSERT INTO SELECT statement overview and examples
  • SQL Lag function overview and examples
  • SQL IF Statement introduction and overview

Trending

  • SQL Server Transaction Log Backup, Truncate and Shrink Operations
  • Six different methods to copy tables between databases in SQL Server
  • How to implement error handling in SQL Server
  • Working with the SQL Server command line (sqlcmd)
  • Methods to avoid the SQL divide by zero error
  • Query optimization techniques in SQL Server: tips and tricks
  • How to create and configure a linked server in SQL Server Management Studio
  • SQL replace: How to replace ASCII special characters in SQL Server
  • How to identify slow running queries in SQL Server
  • SQL varchar data type deep dive
  • How to implement array-like functionality in SQL Server
  • All about locking in SQL Server
  • SQL Server stored procedures for beginners
  • Database table partitioning in SQL Server
  • How to drop temp tables in SQL Server
  • How to determine free space and file size for SQL Server databases
  • Using PowerShell to split a string into an array
  • KILL SPID command in SQL Server
  • How to install SQL Server Express edition
  • SQL Union overview, usage and examples

Solutions

  • Read a SQL Server transaction log
  • SQL Server database auditing techniques
  • How to recover SQL Server data from accidental UPDATE and DELETE operations
  • How to quickly search for SQL database data and objects
  • Synchronize SQL Server databases in different remote sources
  • Recover SQL data from a dropped table without backups
  • How to restore specific table(s) from a SQL Server database backup
  • Recover deleted SQL data from transaction logs
  • How to recover SQL Server data from accidental updates without backups
  • Automatically compare and synchronize SQL Server data
  • Open LDF file and view LDF file content
  • Quickly convert SQL code to language-specific client code
  • How to recover a single table from a SQL Server database backup
  • Recover data lost due to a TRUNCATE operation without backups
  • How to recover SQL Server data from accidental DELETE, TRUNCATE and DROP operations
  • Reverting your SQL Server database back to a specific point in time
  • How to create SSIS package documentation
  • Migrate a SQL Server database to a newer version of SQL Server
  • How to restore a SQL Server database backup to an older version of SQL Server
  • BI performance counters
  • SQL code smells rules
  • SQL Server wait types

© Quest Software Inc. ALL RIGHTS RESERVED. | GDPR | Terms of Use | Privacy

Set nocount on что это

1. Какой прирост в процентах дает SET NOCOUNT ON?
2. Когда противопоказано SET NOCOUNT ON
3. Если все данные крутятся на сервере + темповые таблицы, то есть ли смысл в SET NOCOUNT ON

(0) Как вы понимаете значение этих инструкций? Потому как складывается впечатление, что никак.
http://technet.microsoft.com/ru-ru/library/ms189837.aspx

(1) справку осилил до создания темы однако )

если я нигде не использую @@ROWCOUNT, то можно смело использовать SET NOCOUNT ON ?
может 1с++ где-нить скрыто этот признак использует

для несколько запросов то для odbc SET NOCOUNT ON обязателен
чтобы вернуть последний результат
(3) Нет, о том что в результате работы запроса может получиться несколько рекордсетов, слышали?
(3) SET NOCOUNT ON/OFF никак не влияет на @@ROWCOUNT
(5) типа пакетного запроса?
и что с ними?

(7) Сильно не понял. Количество строк имеет привычку возвращаться как результат запроса. SET NOCOUNT это запрещает (ну или разрешает). Со всеми отсюда вытекающими.

(0) Откл Вкл сообщений при выполнении запросов . Как то так. Выключать при использовании триггеров в 1С 77 . Иначе не взлетит.

както все расплывчато
толи никто не в теме
толи вопросы в 0 тупые и отвечать никто не хочет

(10) 1.Открой QA/MS
2. Выполни

SET NOCOUNT ON
Select * from ТвояТаблица

Что пишет в окне сообщений ?

SET NOCOUNT OFF
Select * from ТвояТаблица

Что пишет в окне сообщений ?

(10) Всё как раз конкретно. Посмотри описание ВыполнитьИнструкцию(). И подумай, а что произойдёт, если ей подсунуть что-то сложносочинённое.

(11) ну то что не выводит сообщения я знаю, тока это к 0 никакого отношения
(12) у меня куча выполнитьскалярный а вот выпонитьинструкцию уже простой

Короче в хранимках и триггурах используй всегда SET NOCOUNT ON
В батчах с DML запросами используй всегда SET NOCOUNT ON
Кроме единственного случая когда количество строк после DML запроса надо получить методом ВыполнитьИнструкцию()
(что бы ВыполнитьИнструкцию() вернул количество обработанных строк нужен set nocount off)

(13) О! Посмотри описание ВыполнитьСкалярный! Не знаю, как сейчас, а раньше в описании было «Запрос может возвращать количество обработанных строк: в этом случае возвращается это значение».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *