@@ROWCOUNT در SQL Server؛ آموزش جامع، ۱۰ مثال و نکات Performance

آموزش کامل @@ROWCOUNT در SQL Server؛ تعداد ردیف‌های پردازش‌شده

توسط admin | گروه SQL Server | 1405/04/29

نظرات 0

آموزش جامع @@ROWCOUNT در SQL Server؛ تعداد ردیف‌های پردازش‌شده

مقدمه

@@ROWCOUNT یکی از قابلیت‌های سیستمی Transact-SQL است که در عیب‌یابی، کنترل عملیات و ثبت Metadata کاربرد دارد. این مقاله از تعریف پایه شروع می‌کند و سپس با ده مثال مستقل، رفتار واقعی آن را در SQL Server توضیح می‌دهد.

تعداد ردیف‌هایی را برمی‌گرداند که آخرین دستور اجراشده در همان اتصال خوانده یا تغییر داده است. دانستن همین تعریف کافی نیست؛ باید مرز نشست، Scope، آخرین Statement و اثر دستورهای بعدی را نیز شناخت تا مقدار خروجی به اشتباه به عملیات دیگری نسبت داده نشود.

در پروژه‌های عملی بهتر است استفاده از @@ROWCOUNT بخشی از یک قرارداد روشن باشد: دستور اجرا می‌شود، مقدار بلافاصله دریافت می‌گردد، وضعیت خطا یا تراکنش کنترل می‌شود و نتیجه لازم برای لاگ یا لایه برنامه بازگردانده می‌شود.

برای مشاهده جایگاه این قابلیت در کنار سایر توابع سیستمی، راهنمای جامع توابع سیستمی SQL Server را نیز مطالعه کنید.

تعریف، کاربرد و مرز عملکرد

نوع خروجی @@ROWCOUNT برابر int است. هنگام ذخیره در ستون یا متغیر، نوع مقصد را آگاهانه انتخاب کنید؛ تبدیل ضمنی ممکن است در حجم بالا، مقدار بزرگ یا تغییر Schema باعث خطای سرریز یا رفتار پیش‌بینی‌نشده شود.

هر دستور بعدی می‌تواند مقدار آن را عوض کند؛ بنابراین باید بلافاصله در یک متغیر محلی ذخیره شود. این نکته به‌ویژه زمانی مهم است که Trigger، Dynamic SQL، Stored Procedure تو‌در‌تو، Connection Pooling یا چند دستور تشخیصی در مسیر اجرا وجود دارد.

خروجی صفر، NULL یا مقدار قدیمی الزاماً خطای موتور نیست؛ گاهی تعریف تابع دقیقاً چنین رفتاری دارد. برای تحلیل درست، یک آزمایش کوچک در همان اتصال بسازید و قبل و بعد از هر Statement مقدارهای مرتبط را ثبت کنید.

قاعده طلایی: هر دستور بعدی می‌تواند مقدار آن را عوض کند؛ بنابراین باید بلافاصله در یک متغیر محلی ذخیره شود. نتیجه را همراه با زمینه اجرا تفسیر کنید و از تبدیل یک مقدار سیستمی به فرض تجاری بدون آزمون پرهیز نمایید.

Syntax و نوع خروجی

نحو پایه @@ROWCOUNT کوتاه است، اما محل فراخوانی آن معنای خروجی را تعیین می‌کند. نمونه زیر خروجی را با نام ستونی واضح ارائه می‌دهد تا مصرف آن در ابزار گزارش‌گیری یا کد برنامه خوانا باشد.

SELECT @@ROWCOUNT AS AffectedRows;

نوع بازگشتی int است. برای API یا لایه داده، نوع C# یا مقصد پایگاه داده را مطابق همین نوع و دامنه مقادیر انتخاب کنید و حالت NULL را، هرجا از نظر معنایی ممکن است، صریح مدیریت نمایید.

مثال‌های عملی از پایه تا حرفه‌ای

ده مثال زیر مستقل طراحی شده‌اند. هر نمونه هدف، Query کامل، خروجی مورد انتظار و نکته کاربردی دارد. اشیای آزمایشی را در پایگاه توسعه اجرا کنید و از اجرای کدهای آموزشی روی Production بدون بازبینی مجوز و اثر قفل خودداری نمایید.

مثال 1: خواندن تعداد ردیف‌های SELECT

مثال پایه با مقدار یا محیط کنترل‌شده است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT v.Number
    FROM (VALUES (10),(20),(30)) AS v(Number);
    SELECT @@ROWCOUNT AS RowsReturned;
خروجی مورد انتظارتفسیر
3نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 2: کنترل تعداد ردیف‌های UPDATE

نمونه قابل اجرا روی داده آزمایشی است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

CREATE TABLE #Stock(Id int PRIMARY KEY, Qty int);
    INSERT #Stock VALUES (1,5),(2,8),(3,0);
    UPDATE #Stock SET Qty = Qty + 1 WHERE Qty > 0;
    DECLARE @Changed int = @@ROWCOUNT;
    SELECT @Changed AS ChangedRows;
    DROP TABLE #Stock;
خروجی مورد انتظارتفسیر
2نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 3: ثبت نتیجه DELETE

کاربرد در SELECT و مشاهده خروجی است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

CREATE TABLE #Queue(Id int, Done bit);
    INSERT #Queue VALUES (1,1),(2,0),(3,1);
    DELETE FROM #Queue WHERE Done = 1;
    SELECT @@ROWCOUNT AS DeletedRows;
    DROP TABLE #Queue;
خروجی مورد انتظارتفسیر
2نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 4: تصمیم‌گیری با IF

کاربرد در تصمیم‌گیری یا کنترل جریان است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

UPDATE sys.tables SET lock_on_bulk_load = lock_on_bulk_load WHERE 1 = 0;
    IF @@ROWCOUNT = 0
        SELECT N'هیچ ردیفی تغییر نکرد' AS Message;
خروجی مورد انتظارتفسیر
هیچ ردیفی تغییر نکردنتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 5: تأثیر SET NOCOUNT

ترکیب با قابلیت‌های دیگر SQL Server است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SET NOCOUNT ON;
    SELECT TOP (2) name FROM sys.objects ORDER BY object_id;
    SELECT @@ROWCOUNT AS RowsDespiteNoCount;
خروجی مورد انتظارتفسیر
2نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 6: ذخیره فوری در متغیر

بررسی مقدار تهی یا وضعیت بدون داده است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT TOP (4) object_id FROM sys.objects ORDER BY object_id;
    DECLARE @Rows int = @@ROWCOUNT;
    SELECT @Rows AS CapturedRows, @@ROWCOUNT AS CurrentRows;
خروجی مورد انتظارتفسیر
CapturedRows برابر 4نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 7: رفتار نتیجه خالی

رفتار مرزی و شرایط غیرمعمول است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT object_id FROM sys.objects WHERE object_id < 0;
    SELECT @@ROWCOUNT AS EmptyResultRows;
خروجی مورد انتظارتفسیر
0نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 8: ثبت در گزارش عملیات

سناریوی واقعی پایش یا گزارش‌گیری سازمانی است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DECLARE @Audit TABLE(OperationName nvarchar(30), AffectedRows int);
    SELECT TOP (5) name FROM sys.objects;
    DECLARE @N int = @@ROWCOUNT;
    INSERT @Audit VALUES (N'خواندن اشیا', @N);
    SELECT * FROM @Audit;
خروجی مورد انتظارتفسیر
AffectedRows برابر 5نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 9: روش اشتباه و اصلاح آن

روش اشتباه و نسخه اصلاح‌شده است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT TOP (3) name FROM sys.objects;
    SELECT GETDATE() AS ExtraStatement;
    -- مقدار فعلی دیگر متعلق به SELECT اول نیست
    SELECT @@ROWCOUNT AS WrongValue;
    SELECT TOP (3) name FROM sys.objects;
    DECLARE @Correct int = @@ROWCOUNT;
    SELECT @Correct AS CorrectValue;
خروجی مورد انتظارتفسیر
CorrectValue برابر 3نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: این نمونه مرز میان روش شکننده و الگوی قابل اتکا را نشان می‌دهد. هر دستور بعدی می‌تواند مقدار آن را عوض کند؛ بنابراین باید بلافاصله در یک متغیر محلی ذخیره شود. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 10: الگوی کارآمد برای عملیات گروهی

نکته کارایی، ایمنی یا نگهداشت‌پذیری است. هدف این است که رفتار @@ROWCOUNT در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

CREATE TABLE #Orders(Id int PRIMARY KEY, Status tinyint);
    INSERT #Orders VALUES (1,0),(2,0),(3,1);
    UPDATE #Orders SET Status = 1 WHERE Status = 0;
    DECLARE @BatchSize int = @@ROWCOUNT;
    SELECT @BatchSize AS BatchSize;
    DROP TABLE #Orders;
خروجی مورد انتظارتفسیر
2نتیجه، رفتار @@ROWCOUNT را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

خطاهای رایج

بخش مهم یادگیری @@ROWCOUNT شناخت خطاهایی است که Syntax صحیح دارند اما منطق نادرست تولید می‌کنند. این خطاها ممکن است در تست تک‌کاربره دیده نشوند و فقط زیر بار یا با Trigger آشکار گردند.

  • 1. خواندن دیرهنگام مقدار پس از اجرای یک SELECT دیگر. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 2. فرض اینکه SET NOCOUNT ON مقدار @@ROWCOUNT را صفر می‌کند. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 3. استفاده از آن به‌عنوان شمارنده دائمی میان چند Batch. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 4. نادیده گرفتن مقدار صفر در عملیات هم‌زمان. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.

در رخداد واقعی، تنها پیام خطا کافی نیست. نام Procedure، شماره خط، ورودی‌های پالایش‌شده، وضعیت تراکنش و شناسه نشست را ثبت کنید تا علت اصلی از نشانه ثانویه تفکیک شود.

Performance و بهینه‌سازی

برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد.

برای سنجش اثر واقعی، قبل و بعد از تغییر کد از Query Store، Actual Execution Plan، SET STATISTICS IO/TIME و در صورت نیاز Extended Events استفاده کنید. اندازه‌گیری باید روی Query اصلی، تعداد Logical Read، زمان CPU، مدت قفل و حجم Log متمرکز باشد.

از اجرای Query اضافی فقط برای بازسازی اطلاعاتی که موتور همان لحظه در اختیار گذاشته اجتناب کنید. در عین حال، تابع سیستمی را جایگزین کنترل صحت داده، Constraint، ایندکس مناسب یا طراحی Transaction نکنید.

در پردازش گروهی، نتیجه هر Batch را ثبت کنید و اندازه Batch را طوری تنظیم نمایید که زمان قفل و رشد Log قابل کنترل باشد. شکست جزئی باید سیاست Retry محدود و Idempotency مشخص داشته باشد.

بهترین روش‌ها و کاربرد سازمانی

  • مقدار @@ROWCOUNT را در نزدیک‌ترین نقطه به دستور مرجع بخوانید.
  • نوع خروجی int و امکان NULL یا صفر را صریح در مدل داده لحاظ کنید.
  • برای خطا از TRY...CATCH، THROW و XACT_STATE با قرارداد یکسان استفاده کنید.
  • کد را زیر هم‌زمانی واقعی و در حضور Trigger یا Connection Pooling آزمایش کنید.
  • از Hard-code کردن نام محیط و فرض‌های وابسته به ترتیب اجرا خودداری کنید.
  • در لاگ، SPID، زمان، نام دیتابیس و شناسه همبستگی را بدون داده حساس نگه دارید.

در سامانه‌های فروش، مالی، انبار، اتوماسیون یا گزارش‌گیری، این الگو به تیم پشتیبانی کمک می‌کند نتیجه هر عملیات را سریع‌تر ردیابی کند. ارزش اصلی زمانی ایجاد می‌شود که Metadata فنی با شناسه تجاری سفارش یا درخواست مرتبط شود.

برای مهاجرت نسخه یا انتقال به محیط جدید، مجموعه تست سازگاری بسازید. Compatibility Level، مجوز DMVها، رفتار Driver و تنظیمات Connection Pool می‌توانند روی مشاهده‌پذیری پیرامون تابع اثر بگذارند، حتی اگر Syntax خود تابع ثابت مانده باشد.

سؤالات متداول

پرسش 1: @@ROWCOUNT دقیقاً چه کاری انجام می‌دهد؟

@@ROWCOUNT تعداد ردیف‌هایی را برمی‌گرداند که آخرین دستور اجراشده در همان اتصال خوانده یا تغییر داده است. خروجی باید در متن همان Batch و با توجه به Scope، Session و دستور قبلی تفسیر شود؛ جدا کردن آن از زمینه اجرا می‌تواند نتیجه‌ای ظاهراً درست اما از نظر تجاری اشتباه بسازد.

پرسش 2: بهترین زمان خواندن @@ROWCOUNT چه موقع است؟

بهترین زمان بلافاصله پس از دستور مرتبط است. اگر مقدار برای چند مرحله بعد لازم است، آن را در متغیری با نوع مناسب ذخیره کنید و همراه شناسه عملیات ثبت نمایید تا دستورهای واسط مقدار یا معنای آن را تغییر ندهند.

پرسش 3: آیا @@ROWCOUNT برای سامانه‌های سازمانی مناسب است؟

بله، مشروط بر اینکه قرارداد استفاده، مدیریت خطا و تست هم‌زمانی مشخص باشد. در طراحی حرفه‌ای، این تابع بخشی از راه‌حل است و در کنار Transaction، Logging، مجوز حداقلی و پایش Query به کار می‌رود.

پرسش 4: برای پیاده‌سازی صحیح آن به مشاوره SQL Server نیاز است؟

در کد ساده خیر، اما در سامانه‌های مالی، انبار، احراز هویت یا پردازش گروهی بررسی Triggerها، Scopeها و الگوی تراکنش اهمیت زیادی دارد. بازبینی تخصصی می‌تواند از خطاهای خاموش و هزینه اصلاح داده جلوگیری کند.

پرسش 5: تفاوت @@ROWCOUNT با گزینه‌های نزدیک چیست؟

تفاوت اصلی در دامنه مشاهده و نوع اطلاعات است. باید مشخص شود نیاز شما مربوط به آخرین Statement، نشست جاری، Scope جاری، جدول مشخص یا Metadata سرور است؛ سپس تابعی انتخاب شود که دقیقاً همان مرز را پوشش دهد.

پرسش 6: آیا می‌توان این الگو را در Stored Procedure پروژه پیاده کرد؟

بله. بهتر است مقدار در همان Procedure گرفته شود، نوع خروجی صریح باشد، خطا با TRY...CATCH مدیریت شود و نتیجه از طریق Result Set، پارامتر OUTPUT یا قرارداد سرویس بازگردد. تست یکپارچه نیز حالت موفق و شکست را پوشش دهد.

پرسش 7: خطای رایج هنگام استفاده از @@ROWCOUNT چیست؟

خواندن دیرهنگام مقدار پس از اجرای یک SELECT دیگر یکی از خطاهای متداول است. خطای دیگر، اتکا به نتیجه بدون ثبت Context اجراست. نسخه اصلاح‌شده باید زمان خواندن، Scope، رفتار تراکنش و نوع تبدیل را آشکار کند.

پرسش 8: اثر @@ROWCOUNT بر Performance چیست؟

برای تشخیص موفقیت عملیات گروهی مفید است، اما جای طراحی شرط SARGable، بررسی Execution Plan یا شمارش تجاری دقیق را نمی‌گیرد. هزینه اصلی معمولاً از Query یا Transaction پیرامون آن می‌آید، نه خود تابع. اندازه‌گیری با Actual Execution Plan، Query Store و Extended Events باید روی کل جریان انجام شود.

پرسش 9: Best Practice اصلی برای @@ROWCOUNT چیست؟

مقدار را نزدیک به دستور مرجع بخوانید، در نوع مناسب ذخیره کنید، نتیجه‌های مرزی مانند صفر یا NULL را تست کنید و برای عملیات حساس گزارش ممیزی بسازید. از تکیه بر ترتیب اتفاقی دستورات یا رشته‌های Hard-coded دوری کنید.

پرسش 10: این قابلیت در کدام نسخه‌های SQL Server کار می‌کند؟

این قابلیت در نسخه‌های رایج و پشتیبانی‌شده SQL Server در دسترس است، اما امکانات مکمل مانند SESSION_CONTEXT، THROW یا برخی DMVها به نسخه و سطح سازگاری وابسته‌اند. پیش از استقرار، مستندات همان نسخه و Compatibility Level پایگاه داده را کنترل کنید.

سؤالات مصاحبه SQL Server

سؤال 1: مرز مشاهده @@ROWCOUNT چیست؟

پاسخ حرفه‌ای باید مشخص کند تابع به Statement، Scope، Session، Table یا Server مربوط است و یک مثال نقض نیز ارائه دهد. گفتن نام تابع بدون توضیح مرز مشاهده برای مصاحبه فنی کافی نیست.

سؤال 2: چگونه مقدار را بدون Race Condition مصرف می‌کنید؟

مقدار باید نزدیک به عملیات مرجع، در همان اتصال و داخل قرارداد تراکنش خوانده شود. برای چند ردیف یا خروجی‌های حساس، قابلیت OUTPUT یا Metadata ساخت‌یافته می‌تواند انتخاب دقیق‌تری باشد.

سؤال 3: در CATCH چه اطلاعاتی ثبت می‌کنید؟

شماره و متن خطا، Procedure، Line، XACT_STATE، @@TRANCOUNT، نام پایگاه داده، SPID و شناسه همبستگی از اطلاعات مفید هستند. داده حساس نباید بدون پالایش وارد Log شود.

سؤال 4: چطور این کد را تست می‌کنید؟

تست موفق، نتیجه خالی، خطا، تراکنش باز، اجرای هم‌زمان و وجود Trigger یا دستور واسط باید جداگانه پوشش داده شود. تست باید مقدار خروجی و وضعیت نهایی داده را هر دو بررسی کند.

سؤال 5: چه زمانی گزینه دیگری را انتخاب می‌کنید؟

وقتی تابع مرز موردنیاز را پوشش نمی‌دهد یا فقط یک مقدار از مجموعه‌ای بزرگ را برمی‌گرداند. انتخاب باید بر اساس هدف تجاری، هم‌زمانی، نسخه SQL Server و قابلیت مشاهده‌پذیری انجام شود.

چک‌لیست نهایی

  • تعریف و مرز @@ROWCOUNT را با یک مثال توضیح داده‌ام.
  • مقدار بلافاصله پس از دستور مرتبط ذخیره می‌شود.
  • حالت صفر، NULL، خطا و هم‌زمانی تست شده است.
  • تراکنش در مسیر موفق Commit و در مسیر شکست Rollback می‌شود.
  • نتیجه با نوع مناسب و نام ستون روشن به لایه مصرف‌کننده می‌رسد.
  • لاگ فنی برای عیب‌یابی وجود دارد و داده حساس ثبت نمی‌شود.

جمع‌بندی

@@ROWCOUNT تعداد ردیف‌هایی را برمی‌گرداند که آخرین دستور اجراشده در همان اتصال خوانده یا تغییر داده است. استفاده حرفه‌ای از آن به معنی شناخت دقیق مرز، خواندن در زمان مناسب، مدیریت نوع خروجی و آزمون رفتار در شرایط واقعی است.

برای تکمیل مسیر یادگیری و مقایسه با قابلیت‌های مرتبط، به مقاله مادر توابع سیستمی SQL Server بازگردید. مثال‌ها را ابتدا در محیط آزمایشی اجرا و سپس با استاندارد تراکنش، امنیت و مانیتورینگ پروژه خود تطبیق دهید.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620