خانه SQL Server تغییرات زبان T-SQL در SQL Server 2022 – قسمت سوم SQL Server دستورات SQL نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۲۸ دی ۱۴۰۱ آخرین بروزرسانی: ۰۳ آبان ۱۴۰۲ زمان مطالعه: 20 دقیقه ۴.۶ (۱۰) مقدمه در مقاله اول به DISTINCT FROM ،DATE_BUCKET ،GENERATE_SERIES ،GREATEST/LEAST،STRING_SPLIT و DATETRUNC پرداخته شد. در مقاله دوم APPROX_PERCENTILE_CONT ،APPROX_PERCENTILE_DISC، توابع دستکاری بیت، همراه با تغییرات FIRST_VALUE ،LAST_VALUE و LTRIM/RTRIM/TRIM ارائه شد. در این مقاله قصد داریم به ویژگیهای JSON در پایگاه داده SQL Server 2022 بپردازیم.شایان ذکر است که نیک آموز یک مرکز تخصصی برای فراگیری برنامه نویسی و علم داده است و یکی از بهترین آموزشها در زمینه ی آموزش SQL Server را در اختیار علاقه مندان به این تخصص قرار داده است . ارزیابی من از پایگاه داده SQL Server 2022 از دیدگاه شخصی است که سعی میکند تصمیم بگیرد که آیا ارتقای سیستم به ورژن جدید ارزش دارد یا خیر. در حال بررسی هستم که کدام تغییرات جدید زبان T-SQL باعث تسهیل در کدنویسی میشود. من برای بررسیهای خود در این مقاله با SQL Server 2022 RTM کار میکنم. ویژگی های JSON SQL Server تعدادی ویژگی جدید برای JSON را به زبان T-SQL در SQL Server 2022 اضافه کرده است. توابع زیر اضافه شدهاند: ()JSON_PATH_EXISTS ()JSON_OBJECT ()JSON_ARRAY قبلاً توابع دیگری مانند ()JSON_MODIFY() ،JSON_QUERY() ،JSON_VALUE از SQL Server 2016 در دسترس بودند، اما تغییری در آنها ایجاد نشده است. یک تابع قبلاً وجود داشت به نام ()ISJSON که در ورژن اخیر بهبود یافته است. در این مقاله به سه تابع جدید بالا به علاوه ()ISJSON میپردازم. ()JSON_OBJECT تابع ()JSON_OBJECT در SQL Server جدید است که برای ساخت شی JSON طراحی شده است. اساساً این تابع، داکیومنت را به عنوان JSON معتبر با key-valueهای مختلف موجود در داخل آن تنظیم میکند. به جای استفاده از الحاق رشتهها برای کنار هم قرار دادن یک داکیومنت JSON، میتوانید فهرستی از جفتهای key-value ارائه دهید و از این تابع بخواهید آنها را کنار هم قرار دهد. این تابع تعداد متغیری از آرگومانها را میگیرد. هریک از این آرگومانها به عنوان عبارات key-value به شکل “string1 : string2” جفت میشوند. هردو رشته یا متغیر با یک دو نقطه (colon) از هم جدا میشوند. سپس هرجفت آرگومان با کاما از هم جدا میشوند. به این معنی است که یک جفت key-value به صورت زیر ارسال میشود: selectJSON_OBJECT(@s1 : @s2) اگر لازم بود دو جفت key-value را کنار هم بگذارم، ساختار به این صورت خواهد بود: selectJSON_OBJECT(@s1 : @s2, @s3 : @s4) جفت key-value های اضافی از همان فرمت استفاده از کاما و دو رشته جدا شده با دو نقطه، پیروی میکنند. اگر فقط یک آرگومان ارسال شود، خطا برگردانده میشود. من محدودیتی برای پارامترها ندیدم، تا ۵۰۰۰ جفت key-value را تست کردم و نتایج موفقیتآمیزی گرفتم. همچنین عبارت JSON NULL وجود دارد که میتواند به صورت اختیاری استفاده شود. این عبارت تعیین میکند که چگونه مقادیر NULL مدیریت شوند. دو آپشن زیر را برای این عبارت داریم: NULL On NULL ABSENT ON NULL اگر از پارامتر اول استفاده شود، یک SQL NULL به JSON NULL تبدیل میشود. اگر از آپشن دوم استفاده کنیم، این مقدار حذف میشود. این تابع یک رشته JSON که از نوع NVARCHAR(MAX) است را برمیگرداند. بررسی میکنیم ببینیم چگونه میتوانید از این تابع استفاده کنید. اگر این تابع را بدون آرگومان فراخوانی کنم، کار میکند؛ اما بعید میدانم کاربردی باشد. این تابع را با مقادیر اسکالر فراخوانی میکنم. دو رشته را ارسال میکنم تا نتیجه را برگرداند. من اسم خود را به عنوان یک مقدار استفاده میکنم و کلید آن را “name” قرار میدهم. کد به صورت زیر فراخوانی میشود: select json_object( 'fname' : 'Frank') خروجی به صورت زیر است: {"fname":"Frank"} اگر کلید (یا مقدار) را داخل quote قرار ندهید، با خطای زیر مواجه خواهید شد. این خطایی است که من بدون quote در مورد fname دریافت کردم. Msg 207, Level 16, State 1, Line 1 Invalid column name 'fname'. همچنین میتوانم از متغیرهایی مانند زیر استفاده کنم: declare @s1 varchar(100), @s2 varchar(100); select @s1 = 'fname' select @s2 = 'Frank' selectJSON_OBJECT(@s1:@s2) نتیجه حاصل از این کد همان خروجی مثال اسکالر است که در بالا آوردم. اگر دو جفت key-value بخواهم، میتوانم از کد زیر استفاده کنم: declare @s1 varchar(100), @s2 varchar(100); select @s1 = 'name' select @s2 = 'Frank' selectJSON_OBJECT(@s1:@s2) declare @s3 varchar(100), @s4 varchar(100); select @s3 = 'language' select @s4 = 'PowerShell' selectJSON_OBJECT(@s1 : @s2, @s3 : @s4) خروجی به صورت زیر خواهد بود: {"name":"Frank","language":"PowerShell"} به مثال بعدی دقت کنید. من جدولی از سفارشات فروش به نام SalesOrders (از مقاله قبلی) دارم که به شکل زیر است: SaleID LineNumber SaleDate CustomerID ProductID Qty Price LineTotal ---------- ------------- ---------------------- ----------- ----------- ----- ---------- -------------- ۱ ۱ ۲۰۲۰-۰۶-۰۱ ۰۰:۰۰:۰۰.۰۰۰ ۱ ۵۰ ۱ ۱۰۰.۰۰۰۰ ۱۰۰.۰۰۰۰ ۱ ۲ ۲۰۲۰-۰۶-۰۱ ۰۰:۰۰:۰۰.۰۰۰ ۱ ۵۱ ۱۰ ۵۰.۰۰۰۰ ۵۰۰.۰۰۰۰ ۲ ۱ ۲۰۲۰-۰۶-۰۵ ۰۰:۰۰:۰۰.۰۰۰ ۴ ۵۲ ۵ ۱۰.۰۰۰۰ ۵۰.۰۰۰۰ ۳ ۱ ۲۰۲۰-۰۶-۰۵ ۰۰:۰۰:۰۰.۰۰۰ ۶ ۵۳ ۱۰ ۶.۰۰۰۰ ۶۰.۰۰۰۰ ابتدا از یک ستون در تابع استفاده میکنیم. من ابتدا از SaleDate استفاده خواهم کرد، به این صورت: select JSON_OBJECT('SaleDate':SaleDate) from SalesOrder go مقادیر زیر را به من به عنوان خروجی میدهد: {"SaleDate":"2020-06-01T00:00:00"} {"SaleDate":"2020-06-01T00:00:00"} {"SaleDate":"2020-06-05T00:00:00"} {"SaleDate":"2020-06-05T00:00:00"} {"SaleDate":"2020-06-05T00:00:00"} {"SaleDate":"2020-06-05T00:00:00"} {"SaleDate":"2020-06-09T00:00:00"} {"SaleDate":"2020-06-15T00:00:00"} {"SaleDate":"2020-06-15T00:00:00"} {"SaleDate":"2020-06-15T00:00:00"} در گام بعدی میتوانم از چندین ستون نیز استفاده کنم. فرض کنید من SaleID، SaleDate و CustomerID را میخواهم. میتوانم از این کد استفاده کنم: select JSON_OBJECT('SaleID' : SaleID ,'SaleDate':SaleDate, 'CustomerID': CustomerID) from SalesOrder go خروجی زیر برای من برمیگردد: {"SaleID":1,"SaleDate":"2020-06-01T00:00:00","CustomerID":1} {"SaleID":1,"SaleDate":"2020-06-01T00:00:00","CustomerID":1} {"SaleID":2,"SaleDate":"2020-06-05T00:00:00","CustomerID":4} {"SaleID":3,"SaleDate":"2020-06-05T00:00:00","CustomerID":6} {"SaleID":3,"SaleDate":"2020-06-05T00:00:00","CustomerID":6} {"SaleID":3,"SaleDate":"2020-06-05T00:00:00","CustomerID":6} {"SaleID":4,"SaleDate":"2020-06-09T00:00:00","CustomerID":7} {"SaleID":5,"SaleDate":"2020-06-15T00:00:00","CustomerID":1} {"SaleID":5,"SaleDate":"2020-06-15T00:00:00","CustomerID":1} {"SaleID":5,"SaleDate":"2020-06-15T00:00:00","CustomerID":1} در گام بعدی قصد دارم تابع را تودرتو کنم. این کار میتواند داکیومنت پیچیدهتری به من بدهد. فرض کنید من یک داکیومنت با سه key-value میخواهم:SaleID، CustomerID و OrderDetails. OrderDetails داکیومنت مجزای خود را دارد که شامل quantity ،date و price است. من میتوانم این کد را اجرا کنم: select JSON_OBJECT('SaleID' : SaleID ,'CustomerID': CustomerID, 'OrderDetails': JSON_OBJECT('SaleDate':SaleDate,'Qty': Qty, 'Price':Price)) from SalesOrder go خروجی به صورت زیر خواهد بود: {"SaleID":1,"CustomerID":1,"Order":{"SaleDate":"2020-06-01T00:00:00","Qty":1,"Price":100.0000}} {"SaleID":1,"CustomerID":1,"Order":{"SaleDate":"2020-06-01T00:00:00","Qty":10,"Price":50.0000}} {"SaleID":2,"CustomerID":4,"Order":{"SaleDate":"2020-06-05T00:00:00","Qty":5,"Price":10.0000}} {"SaleID":3,"CustomerID":6,"Order":{"SaleDate":"2020-06-05T00:00:00","Qty":10,"Price":6.0000}} {"SaleID":3,"CustomerID":6,"Order":{"SaleDate":"2020-06-05T00:00:00","Qty":6,"Price":6.0000}} {"SaleID":3,"CustomerID":6,"Order":{"SaleDate":"2020-06-05T00:00:00","Qty":100,"Price":5.0000}} {"SaleID":4,"CustomerID":7,"Order":{"SaleDate":"2020-06-09T00:00:00","Qty":2,"Price":100.0000}} {"SaleID":5,"CustomerID":1,"Order":{"SaleDate":"2020-06-15T00:00:00","Qty":4,"Price":100.0000}} {"SaleID":5,"CustomerID":1,"Order":{"SaleDate":"2020-06-15T00:00:00","Qty":4,"Price":25.0000}} {"SaleID":5,"CustomerID":1,"Order":{"SaleDate":"2020-06-15T00:00:00","Qty":8,"Price":50.0000}} در مثالی پیچیدهتر قصد دارم همه این ستونها را در قالب یک داکیومنت دریافت کنم. برای این کار نوعی الحاق چند ردیفی یا پردازش مجموعه نتایج مورد نیاز است. اگر چه برای انجام این مثال بهتر است از تابع ()JSON_ARRAY استفاده کنم که در ادامه مقاله به آن خواهم پرداخت. در مورد عبارت NULL یک مثال میآورم. من یک جدول جدید با ۳ ردیف درست میکنم. جدول به صورت زیر است: appttime title ---------- ---------- Mon 10am Standup Tue 10am Standup Fri 4pm NULL برای انجام این مثال میتوانم از این کد با عبارت NULL ON NULL استفاده کنم: select json_object( 'Appt' : appttime, 'title':title NULL ON NULL) from schedule نتایج به صورت زیر خواهد بود: {"Appt":"Mon 10am","title":"Standup"} {"Appt":"Tue 10am","title":"Standup"} {"Appt":"Fri 4pm","title":null} اگر آپشن را به ABSENT ON NULL تغییر دهم، کد و خروجی به صورت زیر میشود: select json_object( 'Appt' : appttime, 'title':title ABSENT ON NULL) from schedule ----- {"Appt":"Mon 10am","title":"Standup"} {"Appt":"Tue 10am","title":"Standup"} {"Appt":"Fri 4pm"} همانطور که میبینید، من میتوانم JSON null را اضافه کنم یا فقط key-value با مقدار null را حذف کنم. ()JSON_ARRAY این تابع یکی دیگر از توابع جدید است. ()JSON_ARRAY برای ساخت یک آرایه JSON معتبر از ورودیها طراحی شده است. مانند تابع قبلی، این تابع میتواند از تعداد متغیری از آرگومانها برای ساخت آرایه استفاده کند. آرایه JSON مجموعهای از مقادیر داخل براکت است که با کاما از هم جدا شدهاند. همچنین عبارت JSON NULL وجود دارد که میتواند به صورت اختیاری استفاده شود. همانند تابع ()JSON_ARRAY، این تابع بدون آرگومان ورودی، یک نتیجه خالی برمیگرداند. در مورد این تابع، فقط براکت باز و بسته را برمیگرداند که نشان دهنده یک آرایه خالی است. کد و نتایج را در زیر مشاهده میکنید: select JSON_ARRAY() --------- [] اگر یک سری مقادیر را داشته باشم و بخواهم آنها را در یک آرایه کنار هم داشته باشم، به صورت زیر میتوان تابع ()JSON_ARRAY را به کار برد: select json_array(1,2,3,4) خروجی به صورت زیر است: در این مثال از ستونی که شامل اعداد است استفاده میکنم. من از جدول dbo.SalesOrder استفاده میکنم: select top 5 json_array(CustomerID) from SalesOrder GO نتایج به صورت زیر است و خروجی آن چیزی نیست که مدنظر من بود: این خروجی خیلی مفید به نظر نمیرسد. اگر چند ستون از جدول را درگیر کنم، چه خروجی حاصل میشود؟ در مثال زیر از چند ستون استفاده کردم. این کد چند مقدار را برمیگرداند. select top 5 json_array(productid, qty,price) from SalesOrder GO نتایج به صورت زیر خواهد بود: [۵۰,۱,۱۰۰.۰۰۰۰] [۵۱,۱۰,۵۰.۰۰۰۰] [۵۲,۵,۱۰.۰۰۰۰] [۵۳,۱۰,۶.۰۰۰۰] [۵۴,۶,۶.۰۰۰۰] به نظر شما خروجی بالا مفید است؟ من در این مورد مطمئن نیستم. آرایههای بالا مشخص نمیکند که هرکدام از اعداد نمایانگر چه پارامتری است. اگر چه به عنوان یک توسعه دهنده، ممکن است دوست داشته باشم با این نوع ساختار کار کنم ولی این نوع خروجی، داکیومنت شده نیست و گویا نمیباشد. به عنوان آخرین مثال از تابع ()JSON_ARRAY، سطرها را به یک رشته متصل میکنم و سپس مقادیر را به تابع ارسال میکنم. کد و خروجی به صورت زیر است: with cteString (Customers) as (SELECT DISTINCT STUFF((SELECT ',' + cast( c2.CustomerID as varchar(10)) as Customers FROM SalesOrder c2 FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 1, 1, '') FROM SalesOrder c1 ) select json_array(Customers) from cteString - - - - - ["۱,۱,۴,۶,۶,۶,۷,۱,۱,۱"] به نظر من تابع ()JSON_ARRAY اصلاً تابعی کاربردی نیست اما اگر به نظر شما مفید بود، میتوانید از آن استفاده کنید. ()JSON_PATH_EXISTS تابع ()JSON_PATH_EXISTS در SQL Server 2022 جدید است. این تابع برای آزمایش یک مسیر در یک رشته JSON طراحی شده است و به شما اطلاع میدهد که آیا مسیر وجود دارد یا خیر. شما میتوانید این نتایج احتمالی، که کمی پیچیده به نظر میرسد را به دست آورید: اگر عبارت ارسال شده NULL باشد، تابع مقدار NULL را برمیگرداند. اگر مسیر وجود داشته باشد، تابع مقدار یک (۱) را برمیگرداند. اگر مسیر وجود نداشته باشد، تابع مقدار صفر (۰) را برمیگرداند. نکته خوب در مورد این تابع این است که خطایی را برنمیگرداند، بنابراین مدیریت خطا وجود ندارد. اما برای سه حالت بالا نیاز به مدیریت نتیجه دارید. من ترجیح میدهم این تابع فقط ۰ یا ۱ را برگرداند. اما اگر رشته NULL JSON را ارسال کنم، NULL برگشت داده خواهد شد. با چند مثال سعی میکنم موضوع را توضیح دهم. برای روشن شدن موضوع چند مثال ارائه میکنم. من از داکیومنت زیر برای مثالها استفاده خواهم کرد. من این داکیومنت را با کدهای دیگر نیز اجرا میکنم. declare @d varchar(max) = '{ "book":{ "isbn":"9781593279509", "title":"Eloquent JavaScript, Third Edition", "author":"Marijn Haverbeke", "website":"http://eloquentjavascript.net/" }, "magazines": [ { "title":"SQL Server Pro", "publisher":"Zinio" }, { "title":"SQL Server Geeks", "publisher":"DPS" } ], "websites": [ { "title":"SQL Server Central", "url":"https://www.sqlservercentral.com" }, { "title":"SQL Blog", "URL":"https://sqlblog.org/" } ] }' مسیر JSON یک فرمت خاص است. با $ به عنوان ریشه شروع میشود و با نقطه (dot) نام هرکلید را ازهم جدا میکند. به مثال زیر نگاه کنید: select JSON_PATH_EXISTS(@d, '$.book') -- returns 1 مسیر ریشه با کلید book است که اولین کلید است. اگر من websites را خواستم، از کد زیر باید استفاده کنم: select JSON_PATH_EXISTS(@d, '$.websites') -- returns 1 اگر به کلید book نگاه کنم، کلیدهای مختلفی را در داخل این کلید میبینم. به عنوان مثال، isbn یک کلید در زیر مجموعه کلید book است. مسیر آن به صورت زیر است: select JSON_PATH_EXISTS(@d, '$.book.isbn') -- returns 1 اشتباهات تایپی (Typos) مهم است و باعث خروجی اشتباه میشود. به مثال زیر دقت کنید. میتوانید مشاهده کنید که این کد، مقدار صفر را برمیگرداند: -- both return 0 select JSON_PATH_EXISTS(@d, '$.book.isnb') select JSON_PATH_EXISTS(@d, '$.book.ISBN') آیا در مورد title در کلید websites میتوانم با کد زیر به نتیجه برسم؟ select JSON_PATH_EXISTS(@d, '$.websites.title') -- returns 0 در واقع، من میتوانم این کد را اجرا کنم و همانطور که گفتیم این تابع خطایی برنمیگرداند اما مقدار برگشتی صفر است؛ چون به وارد کردن index برای آرایه نیاز است. مسیر صحیح websites[0].title است. select JSON_PATH_EXISTS(@d, '$.websites[0].title') -- returns 1 یک مثال مشابه برای url در کلید websites. کد زیر برای مسیر اول یک را برمیگرداند و برای مسیر دوم صفر برگردانده میشود: select JSON_PATH_EXISTS(@d, '$.websites[0].url'), JSON_PATH_EXISTS(@d, '$.websites[1].url') -- returns 1 and 0 اگر در کد بالا کلید را با حروف بزرگ (upper case) وارد کنم، نتیجه متفاوت است. این بار برای مسیر اول صفر را برمیگرداند و برای مسیر دوم یک برگردانده میشود: select JSON_PATH_EXISTS(@d, '$.websites[0].URL'), JSON_PATH_EXISTS(@d, '$.websites[1].URL') -- returns 0 and 1 مثال زیر را آوردم به این هدف که نشان دهم اگر کلید را به صورت اشتباه وارد کنید تابع مقدار خطا هم برمیگرداند. select JSON_PATH_EXISTS(@d, 'dfgdfgfdgd') در نرمافزار SSMS عبارت برگشتی به صورت زیر است: Unexpected character ‘d’ is found at position 0. در مثال زیر یک NULL ارسال کنم و NULL دریافت میکنم. declare @d varchar(max) select JSON_PATH_EXISTS(@d, '$.book') go -- returns NULL من حدس میزنم این تابع زمانی مفید است که میخواهید وجود یک کلید را بررسی کنید. از آنجایی که داکیومنتهای JSON توسط برنامهها و اغلب بدون شِمای اجباری اسمبل (assemble) میشوند، این بدان معناست که ممکن است لازم باشد کلیدها را قبل از پردازش آنها اعتبارسنجی کنید. به نظر میرسد این تابع برای من بسیار کاربردی باشد زیرا خیلی به اعتبارسنجی برای خواندن داکیومنتها نیاز دارم. ()ISJSON تابع ()ISJSON قبل از ورژن SQL Server 2022 نیز وجود داشت، اما در این ورژن بهبود یافته است. در این ورژن میتوانیم نوع پارامتر برگشتی را که از عبارت JSON انتظار داریم مشخص کرده و آن را اعتبارسنجی کنیم. تا قبل از SQL Server 2022، تنها یک پارامتر وجود داشت که یک عبارت string بود. DECLARE @d VARCHAR(1000) = ' { "book":1 }' SELECT ISJSON(@d) -- returns 1 SELECT @d = '"book":1' SELECT ISJSON(@d) -- returns 0 در SQL Server 2022، یک پارامتر دوم اختیاری داریم که میتواند یکی از چهار مقدار VALUE ،SCALAR ،OBJECT،ARRAY باشد. هریک از اینها با یک نوع از ساختار JSON مطابقت دارد. تعاریف زیر از مستندات این تابع آورده شده است: VALUE: یک مقدار JSON معتبر را مورد بررسی قرار میدهد. میتواند از نوع object ،array،number،string یا یکی از سه مقدار (false ،true ،null) باشد. SCALAR: بررسی معتبر بودن JSON از نوع scalar ،number و یا string OBJECT: بررسی معتبر بودن JSON از نوع object ARRAY: بررسی معتبر بودن JSON از نوع array موارد بالا را در مثال زیر بررسی میکنم. کد و خروجی را میتوانید مشاهده کنید. DECLARE @JSON VARCHAR(1000) = ' { "book":1 }' select isjson(@JSON, VALUE) as JSONValue, isjson(@JSON, SCALAR) as JSONSCALAR, isjson(@JSON, ARRAY) as JSONARRAY, isjson(@JSON, OBJECT) as JSONOBJECT -- returns -- JSONValue JSONSCALAR JSONARRAY JSONOBJECT -- ۱ ۰ ۰ ۰ یک مثال دیگر: SELECT @JSON = '"book:1"' select isjson(@JSON, VALUE) as JSONValue, isjson(@JSON, SCALAR) as JSONSCALAR, isjson(@JSON, ARRAY) as JSONARRAY, isjson(@JSON, OBJECT) as JSONOBJECT -- returns -- JSONValue JSONSCALAR JSONARRAY JSONOBJECT -- ۰ ۰ ۰ ۰ چند مورد دیگر را بررسی میکنم. من مقدار JSON را به عنوان اولین نتیجه و سپس چهار نتیجه را درج میکنم. میتوانید حدس بزنید که چه کدی به تابع ()ISJSON ارسال شده است. JSON JSONVALUE JSONScalar JSONArray JSONObject "book" 1 1 0 0 ۱ ۱ ۱ ۰ ۰ {"book": [0,1]} 1 0 0 1 [۰,۱] ۱ ۰ ۱ ۰ {"book": { "title":"DBATools", 1 0 0 1 "Chapters":[1,2] } } خلاصه در این مقاله به ویژگیهای JSON در زبان T-SQL پرداختیم. در ادامه توابع ()JSON_OBJECT و ()JSON_ARRAY را پوشش دادیم که داکیومنت JSON را برمیگرداند. توابع ()JSON_PATH_EXISTS و ()ISJSON برای بررسی داکیومنتهای JSON است. توابع ارائه شده در این مقاله ارزش یادگیری دارند تا درک بهتری از نحوه پردازش داکیومنتهای JSON در صورت نیاز داشته باشید. چه رتبه ای میدهید؟ میانگین ۴.۶ / ۵. از مجموع ۱۰ اولین نفر باش دانلود مقاله تغییرات زبان T-SQL در SQL Server 2022 – قسمت سوم فرمت PDF صفحه حجم مگابایت دانلود مقاله معرفی نویسنده مقالات 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 چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ