پست تنها



چرا این ۳ دستور در کوئری های اسکیوال سرور مورد توجه قرار نمی گیرند!!!

بررسی تاثیر دستورات SET ANSI_NULLS ON ، SET QUOTED_IDENTIFIER ON و SET NOCOUNT ON روی کوئری ها



دستورات SET ANSI_NULLS ON ، SET QUOTED_IDENTIFIER ON و SET NOCOUNT ON برای همه شما بسیار آشنا هستند. این دستورات را زمانی که می خواهید یک Stored Procedure ، Trigger یا تابع ایجاد کنید، بارها و بارها دیده اید و از کنار آنها گذشته باشید. اما بهتر است بدانید اجرای همین دستورات می تواند تاثیر بسیار زیادی در اجرای کوئری های شما مخصوصا در Stored Procedureها و Trigger ها داشته باشد. بهتر است بدانید که در زمان طراحی Stored Procedure ها و Trigger ها دانستن این نکات چقدر می تواند ارزشمند باشد.

دانستن تاثیر دستورات SET ANSI_NULLS ON ، SET QUOTED_IDENTIFIER ON و SET NOCOUNT ON در زمان طراحی Stored Procedure ها و Trigger ها بسیار ارزشمند است.

در این مقاله تاثیر سه دستور SET ANSI_NULLS ON ،SET QUOTED_IDENTIFIER ON و SET NOCOUNT ON را روی کوئری ها بررسی خواهیم کرد.
کار خود را با بررسی دستور SET ANSI_NULLS ON آغاز می کنیم .

بررسی تاثیر دستور SET ANSI_NULLS

در صورتی که مقدار این دستور برابر با ON باشد امکان بررسی مقادیر تهی تنها از طریق عملگر های IS و IS NOT فراهم می شود و در صورتی که مقدار OFF داشته باشد امکان بررسی مقادیر NULL از طریق عملگر های مقایسه ای مانند = نیز فراهم می شود.
برای اینکه تاثیر این دستور را بهتر بدانید ابتدا دستور زیر را روی بانک اطلاعاتی AdventureWorks2012 اجرا کنید :

 

بررسی تاثیر دستور SET ANSI_NULLS OFF

SET ANSI_NULLS OFF

select * from Person.Person
where Title = null
select * from Person.Person
where Title <> null


پس از آنکه دستورات فوق را اجرا کردید، نتیجه اجرا به صورت زیر خواهد بود :

نتیجه اجرای دستورات پس از دستور SET ANSI_NULLS OFF

 

حال دستورات زیر را اجرا کنید :

بررسی نتیجه اجرای دستور SET ANSI_NULLS ON

SET ANSI_NULLS ON

select * from Person.Person where Title = null

select * from Person.Person where Title <> null

select * from Person.Person where Title is null

select * from Person.Person where Title is not null

cنتیجه اجرای دستورات فوق پس از دستور SET ANSI_NULLS ON به صورت تصویر زیر خواهد بود

نتیجه اجرای دستورات پس از دستور SET ANSI_NULLS ON


بررسی دستور SET QUOTED_IDENTIFIER

با توجه به ON یا OFF بودن مقدار این عبارت، SQL Server نسبت به داده‌هایی که درون دابل کوتیشن (“) یا کوتیشن (‘) قرار دارند، به‌طور متفاوتی رفتار می‌کند.

درصورتی‌که مقدار این عبارت برابر با ON باشد، آنگاه SQL Server با مقادیری که درون دابل کوتیشن قرار دارند، به‌عنوان شناسه رفتار می‌کند. در این صورت حتی می‌توان از کلمات رزرو شده‌ی T-SQL به‌عنوان شناسه استفاده نمود. بنابراین می‌توان از این شناسه‌ها، با استفاده از دابل کوتیشن به‌عنوان نام روال ذخیره‌شده و غیره استفاده کرد.

درصورتی‌که مقدار عبارت SET QUOTED_IDENTIFIER برابر با ON باشد، آنگاه SQL Server با مقادیری که درون دابل کوتیشن قرار دارند، به‌عنوان شناسه رفتار می‌کند. در این صورت حتی می‌توان از کلمات رزرو شده‌ی T-SQL به‌عنوان شناسه استفاده کرد

برای درک بهتر به دو مثالی که در ادامه می‌آیند توجه کنید.

در دستور زیر مقدار OFF برای دستور SET QUOTED_IDENTIFIER قرار داده شده و پس از آن تلاش می کنیم جدولی با نام Table که دارای ستونی به نام Function است را ایجاد کنیم :

نتیجه اجرای دستورات پس از دستور SET QUOTED_IDENTIFIER OFF

SET QUOTED_IDENTIFIER OFF

CREATE TABLE "Table"(id int,"Function" VARCHAR(20))


با خطای زیر مواجه خواهیم شد :

خطای حاصل از اجرای دستورات فوق


اما با قرار دادن مقدار ON برای SET QUOTED_IDENTIFIER جدولی که تلاش کردیم در دستور قبلی ایجاد کنیم به راحتی ساخته خواهد شد :

تاثیر دستور SET QUOTED_IDENTIFIER ON

SET QUOTED_IDENTIFIER ON

CREATE TABLE "Table"(id int,"Function" VARCHAR(20))

ننتیجه اجرای دستور فوق به صورت زیر خواهد بود

نتیجه اجرای دستورات پس از دستور SET QUOTED_IDENTIFIER ON

 

دستور SET NOCOUNT

در صورتی که مقدار OFF را برای این دستور قرار دهید تعداد ردیف هایی که تحت تاثر دستور قرار گرفته اند را نمایش میدهد.

اگر از یک دستور Select استفاده می‌کنید که ۱۰ رکورد را برمی‌گرداند، پس از اجرای دستورات در قسمت Message پیغام ۱۰ row(s) affected را مشاهده خواهید کرد این در حالی است که اگر از دستور SET NOCOUNT ON استفاده کنید، پیغام Command(s) completed successfully را مشاهده خواهید کرد.

این اطلاعات هنگامی‌که در حال دیباگ کردن برنامه هستید مفید است. پس از آن، در بسیاری از موارد، این اطلاعات بی‌فایده هستند. با ON و OFF کردن این دستور می تواند بدست آوردن این اطلاعات اضافه را تایید یا لغو کنید.
دستورات زیر را اجرا کنید:

بررسی تاثیر دستور SET NOCOUNT OFF

SET NOCOUNT OFF

select * from Person.Person

 

بخش Message مربوط پنل نتایج به صورت زیر خواهد بود :

تاثیر اجرای دستور SET NOCOUNT OFF در پنل Message

 

اما با تغییر مقدار این دستور به ON . بخش Message مربوط پنل نتایج به صورت دیگری تغییر خواهد کرد. دستورات زیر را اجرا کنید:

بررسی تاثیر دستور SET NOCOUNT ON

SET NOCOUNT ON

select * from Person.Person

حال به پنل نتایج نگاه کنید که به چه شکلی تغییر کرده است

پنل نتایج پس از اجرای دستور SET NOCOUNT ON

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *