خانه SQL Server تغییرات زبان T-SQL در SQL Server 2022 – قسمت اول SQL Server دستورات SQL نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۱۱ دی ۱۴۰۱ آخرین بروزرسانی: ۰۳ آبان ۱۴۰۲ زمان مطالعه: 20 دقیقه ۴.۴ (۲۴) مقدمه پایگاه داده SQL Server 2022 از آگوست ۲۰۲۲ در مرحله پیش نمایش است و احتمالاً این ورژن اواخر امسال منتشر خواهد شد. من این پلتفرم را با این ایده آزمایش میکنم که قصد دارم در سال آینده چند سرور را ارتقا دهم. تغییرات زیادی در پلتفرم پایگاه داده به وجود آمده اما تغییراتی که مربوط به روال توسعه میشود، برای من جذابتر است. این مقاله برخی از تغییرات T-SQL را که در SQL Server 2022 انجام شده را پوشش میدهد. مواردی که ارائه خواهم داد عبارتند از DISTINCT FROM، DATE_BUCKET،GENERATE_SERIES ،GREATEST/LEAST ،STRING_SPLIT و DATETRUNC. چند تغییر هم در T-SQL انجام شده است که در مقاله بعدی (تغییرات زبان T-SQL در SQL Server 2022 قسمت دوم) ارائه خواهم داد. DISTINCT FROM اگر چه این تغییر خیلی به نظرم جالب نبود اما پس از انتشار از آن استفاده کردم و متوجه شدم که ممکن است مفید باشد. برطبق مستندات ارائه شده برای IS [NOT] DISTINCT FROM این تابع، برابری دو عبارت را مقایسه و درست یا نادرست بودن را بررسی میکند؛ حتی اگر یکی از پارامترهای مورد بررسی NULL باشد. به مثال زیر دقت کنید: DECLARE @a INT, @b INT SELECT @a = 1, @b = 1 IF @a = @b SELECT 'equal', @a, @b ELSE SELECT 'unequal', @a, @b SELECT @a = 1, @b = 2 IF @a = @b SELECT 'equal', @a, @b ELSE SELECT 'unequal', @a, @b SELECT @a = 1, @b = null IF @a = @b SELECT 'equal', @a, @b ELSE SELECT 'unequal', @a, @b نتایج زیر را خواهیم داشت: برای مثال دوم از کد زیر استفاده میکنم: DECLARE @a INT , @b INT; SELECT @a = 1, @b = 1; IF @a = @b SELECT 'equal', @a, @b; ELSE IF @a IS NULL OR @b IS NULL SELECT 'unknown', @a, @b; ELSE SELECT 'unequal', @a, @b; SELECT @a = 1, @b = 2; IF @a = @b SELECT 'equal', @a, @b; ELSE IF @a IS NULL OR @b IS NULL SELECT 'unknown', @a, @b; ELSE SELECT 'unequal', @a, @b; SELECT @a = 1, @b = NULL; IF @a = @b SELECT 'equal', @a, @b; ELSE IF @a IS NULL OR @b IS NULL SELECT 'unknown', @a, @b; ELSE SELECT 'unequal', @a, @b; این کد نتایج مناسب را به صورت “equal”،”unequal” و “unknown” میدهد. بدون این تابع جدید، وقتی موارد را مقایسه میکنیم، میتوانیم سه حالت true، false یا NULL داشته باشیم. با وجود این تابع جدید، میتوانیم روال را به صورت زیر انجام دهیم: DECLARE @a INT , @b INT; SELECT @a = 1, @b = NULL; IF @a IS DISTINCT FROM @b SELECT 'unequal', @a, @b; ELSE SELECT 'equal', @a, @b; نتیجه در اینجا “unequal” است حتی اگر یکی از مقادیر NULL باشد. این تابع وقتی کاربردی میشود که نمیخواهم در داخل کد ابتدا NULL بودن یک عبارت را چک کنم و سپس کار مقایسه را انجام دهم. بااستفاده از تابع DISTINCT FROM بدون کنترل NULL بودن، میتوان مقایسه را انجام داد. به مثال زیر دقت کنید: DECLARE @cc INT = 5618; SELECT soh.SalesOrderID , soh.OrderDate , soh.SalesOrderNumber , soh.CustomerID , soh.CreditCardID , soh.CreditCardApprovalCode FROM sales.SalesOrderHeader AS soh WHERE soh.CreditCardID = @cc این کد چند سفارش را به من برمیگرداند. با این حال، اگر ورودی را به NULL تغییر دهم، به صورت زیر خواهد بود: در SQL Server 2022 میتوانم تغییر زیر را اعمال کنم. در این مورد، از IS NOT DISTINCT FROM استفاده میکنم. این کد باعث میشود ردیفهای NULL مشخص شوند. بدون این تابع، من باید ابتدا یک عبارت OR اضافه میکردم تا ISNULL را بررسی کند، هم برای پارامتر ورودی و هم برای مقداری که بررسی میشود. در حالی که با تابع IS NOT DISTINCT FROM نیاز به این روالهای اضافی نیست. DATE_BUCKET تابع DATE_BUCKET تاریخ شروع یک دوره زمانی را بر اساس window یا bucket ای که شما مشخص کردهاید به شما میدهد. این تابع برای موقعیتهایی که دورههای زمانی را گروهبندی یا محاسبه میکنید مفید است. در این قسمت با ارائه چند مثال ساده، کاربرد این تابع را ارائه میدهم. فرض کنید من میخواهم سال را به bucket های ۴ هفتهای تقسیم کنم. در تقویم ۲۰۲۲، این bucket های ۴ هفته به صورت زیر درنظر گرفته شد: 1Jan to 28 Jan ۲۹ 25Jan to Feb ۲۶ 25Feb to Mar به همین ترتیب دورههای زمانی در نظر گرفته میشود. اگر تاریخ شروع خود را ۱ ژانویه تنظیم کنم و تاریخ را در یک بازه زمانی انتخاب کنم، شروع هر bucket برگردانده میشود. من ۴ تاریخ را در قسمتهای مختلف برای چند ماه اول، برای نشان دادن این موضوع انتخاب کردهام. کد به صورت زیر است: DECLARE @origin DATE = '2022/01/01'; DECLARE @bucketsize INT = 4 SELECT date_bucket(week, @bucketsize, CAST('2022/01/15' as date), @origin), date_bucket(week, @bucketsize, CAST('2022/01/30' as date), @origin), date_bucket(week, @bucketsize, CAST('2022/02/25' as date), @origin), date_bucket(week, @bucketsize, CAST('2022/03/04' as date), @origin) نتایج را همانطور که در تصویر زیر میبینید، اولین روز از هر bucket چهار هفتهای برگردانده میشود: اگر نوع bucket را به ماه تغییر دهم و interval را به ۱ کاهش دهم، اولین روز هرماه را دریافت میکنم. GENERATE_SERIES تابع GENERATE_SERIES جدولی از اعداد را به من برمیگرداند که میتوان از آن در جای مناسب استفاده نمود. سینتکس بسیار سادهای دارد و توسعه خوبی روی آن انجام گرفته است. سینتکس به صورت زیر است: GENERATE_SERIES ( start, stop [, step]) اگر start < stop باشد به صورت پیشفرض مقدار step برابر ۱ خواهد بود و در غیراینصورت مقدار step برابر ۱- تنظیم میشود. دقت داشته باشید مقدار step هرگز نمیتواند برابر صفر باشد. اگر لیستی از اعداد ۱ تا ۵ را بخواهم، کد زیر را می توانم اجرا کنم: نکته جالب در مورد این تابع این است که میتوانید از اعداد اعشاری نیز استفاده کنید. فرض کنید میخواهم کاری را با اعداد اعشاری برای درصد انجام دهم. کد زیر لیستی از درصدهای ۱ تا ۱۰۰ را برمیگرداند. نام ستون value است و میتوانید از آن به همان شیوه جدول tally استفاده کنید. GREATEST/LEAST این دو تابع برای من توابع جالبی هستند که باعث میشوند کد بسیار تمیزتر باشد. خوشحالم که GREATEST() و LEAST() به پلتفرم اضافه شدند. این توابع تعدادی از پارامترها را باهم مقایسه کرده و بزرگترین یا کوچکترین آنها را برمیگرداند. چند مثال برای کاربردهای این دو تابع ارائه میکنم: مشاهده میکنید که بزرگترین و کوچکترین اعداد توسط این توابع برگردانده میشوند. اما یک تبدیل datatype نیز اتفاق افتاده است. این روال براساس اولویت datatype است. این توابع برای string ها هم کار میکند: مقادیر موجود در تابع LEAST() به صورت string هستند نه date. ما میتوانیم از date نیز در این توابع استفاده کنیم، اما باید پارامترهای ارسالی از نوع date باشند. همه مقادیر ارسال شده باید ازطریق یک implicit conversion ارسال شوند. نکته کاربردی این توابع برای date این است که NULL ها را نادیده میگیرند. بنابراین اگر تعدادی تاریخ برای سفارش داشته باشم، مانند تاریخهای سفارش، بستهبندی، ارسال و تحویل، میتوانم آخرین تاریخ را به راحتی دریافت کنم: در اینجا من تاریخهای تابع را طوری تنظیم کردهام که معمولاً بهروزرسانی میشوند اما نیازی نیست نگران مقادیر NULL برای سفارش برگشتی و تاریخهای تحویل باشم. این تابع به من آخرین تاریخ را میدهد. STRING_SPLIT تابع STRING_SPLIT در چند ورژن قبلی SQL Server بوده است، اما یکی از دردسرها این بود که وقتی یک رشته را تقسیم میکنید، هیچ امکانی برای مرتبسازی ندارید. این روال در SQL Server 2022 تغییر کرده است. یک پارامتر سوم اختیاری، اضافه شده که میتوانید آن را با عدد ۱ تنظیم کنید تا مقدار ترتیبی را تابع برگرداند. ستون “value” برای رشتههای تقسیم شده و ستون “ordinal” برای ترتیب قرارگیری است. DATETRUNC من اغلب در بسیاری از مواقع به تابع DATETRUNC نیاز ندارم، اما به هرحال یک تابع کاربردی است. این تابع هنگامی مورد نیاز است که میخواهید از مقدار datetime تنها عدد مربوط به ماه را دریافت کنید و یا عدد مربوط به روز را دریافت کنید و برای بقیه مقادیر هم به همین ترتیب. یعنی قسمتهای مختلف یک datetime را جداگانه کنترل کنید. به عنوان مثال میتوانم روز را از تاریخ حذف کنم با مقدار ۰۱ جایگزین کنم و سال و ماه را نگه دارم. یا حتی روز و ماه را از تاریخ حذف کنم و با مقدار ۰۱ جایگزین کنم و تنها سال را نگه دارم. در مورد دقیقه، ثانیه و غیره نیز میتوانید این کنترل را داشته باشید. مثال زیر حالتهای مختلف را نشان میدهد. خلاصه اینها تعدادی از تغییرات T-SQL برای SQL Server 2022 بودند. از GENERATE_SERIES استقبال میکنم؛ زیرا من از جداول tally استفاده میکنم و این تابع میتواند جایگزین خوبی باشد. من مطمئن هستم که استفاده از STRING_SPLIT نیز برای مرتبسازی رشتههای خروجی کاربرد دارد. DATE_BUCKET جالب به نظر میرسد، به خصوص برای محاسبات دورههای زمانی مختلف مفید خواهد بود. توانایی تعیین دورههای زمانی مختلف به گزارشهای مالی کمک میکند که گاهی اوقات از BUCKET های غیرمعمول استفاده کنند. من در مورد DATETRUNC مطمئن نیستم خیلی به دردم بخورد. DISTINCT FROM و GREATEST/LEAST احتمالاً توابعی هستند که من بیشتر از بقیه توابع ارائه شده در این مقاله استفاده خواهم کرد. من دورنمای خوبی را با این تغییرات جدید میبینم که با این پیشرفتها کدنویسی سادهتر و تمیزتر شود. چه رتبه ای میدهید؟ میانگین ۴.۴ / ۵. از مجموع ۲۴ اولین نفر باش دانلود مقاله تغییرات زبان T-SQL در SQL Server 2022 – قسمت اول فرمت PDF 11 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 402 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تیم فنی نیک آموز معرفی محصول مسعود طاهری دوره آموزشی ارتقا به SQL Server 2022 2.280.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ محمد محمدی ۲۶ / ۰۷ / ۰۲ - ۱۰:۰۶ جداول tally چه جداولی هستند پاسخ به دیدگاه