اشتراکها
SharePoint 2016 RTM منتشر شد
در مورد کتابخانهی SQLDom مطالبی را پیشتر در این سایت مطالعه کردهاید (^ و ^). یکی دیگر از کاربردهای آن، فرمت عبارات SQL است. برای مثال تبدیل عبارتی مانند
به نمونهی فرمت شدهی آن:
برای اینکار میتوان از کلاس ذیل کمک گرفت:
در اینجا ابتدا عبارت SQL ورودی Parse شده و سپس به کتابخانهی تولید اسکریپت ScriptDom ارسال میشود. خروجی آن، یک خروجی فرمت شدهاست.
نکتهی جالب دیگری که در اینجا وجود دارد، تهیهی یک خروجی همواره یک شکل است. برای نمونه سه عبارت SQL زیر را در نظر بگیرید:
در اینجا در عبارت اول، from با حروف کوچک نمایش داده شدهاست. در عبارت دوم، where نیز با حروف کوچک نمایش داده شدهاست و در عبارت سوم اینکار در مورد select نیز تکرار شدهاست.
در هر سه حالت یا هر حالت قابل تصور دیگری، خروجی SQL فرمت شدهی حاصل یک چنین شکلی را دارد:
موارد کاربرد آن؟
علاوه بر نمایش زیبای SQL فرمت نشده، احتمالا برنامههای Profiler ایی را دیدهاید که عنوان میکنند قادرند عبارات SQL همانند را تشخیص دهند (جهت یافتن Lazy loading اشتباه). یک چنین خروجی یکسانی، قابلیت تهیه Hash عبارات SQL دریافتی را میسر میکند؛ چون دیگر اینبار مهم نیست که اجزای تشکیل دهندهی یک عبارت SQL با حروف بزرگ هستند یا کوچک و فاصلهی بین آنها چقدر است و آیا در این بین خطوط جدیدی نیز وجود دارند و امثال آن. خروجی نهایی نرمال شدهی توسط Sql120ScriptGenerator همواره یک شکل است. از این دو قابلیت در برنامهی DNTProfiler استفاده شدهاست.
SELECT * FROM tb1 WHERE x1 = '12';
SELECT * FROM tb1 WHERE x1 = '12';
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Microsoft.SqlServer.TransactSql.ScriptDom; namespace SqlDomAnalyzer.Core { public static class PrettyPrintTSql { public static string FormatTSql(string tSql) { IList<ParseError> errors; TSqlScript sqlFragment; using (var reader = new StringReader(tSql)) { var parser = new TSql120Parser(initialQuotedIdentifiers: true); sqlFragment = (TSqlScript)parser.Parse(reader, out errors); } if (errors != null && errors.Any()) { var sb = new StringBuilder(); foreach (var error in errors) sb.AppendLine(error.Message); throw new InvalidOperationException(sb.ToString()); } var sql110ScriptGenerator = new Sql120ScriptGenerator(new SqlScriptGeneratorOptions { SqlVersion = SqlVersion.Sql120 }); string finalScript; sql110ScriptGenerator.GenerateScript(sqlFragment, out finalScript); return finalScript; } } }
نکتهی جالب دیگری که در اینجا وجود دارد، تهیهی یک خروجی همواره یک شکل است. برای نمونه سه عبارت SQL زیر را در نظر بگیرید:
SELECT * from tb1 WHERE x1 = '12'; SELECT * from tb1 where x1 = '12'; select * from tb1 WHERE x1 = '12';
در هر سه حالت یا هر حالت قابل تصور دیگری، خروجی SQL فرمت شدهی حاصل یک چنین شکلی را دارد:
SELECT * FROM tb1 WHERE x1 = '12';
موارد کاربرد آن؟
علاوه بر نمایش زیبای SQL فرمت نشده، احتمالا برنامههای Profiler ایی را دیدهاید که عنوان میکنند قادرند عبارات SQL همانند را تشخیص دهند (جهت یافتن Lazy loading اشتباه). یک چنین خروجی یکسانی، قابلیت تهیه Hash عبارات SQL دریافتی را میسر میکند؛ چون دیگر اینبار مهم نیست که اجزای تشکیل دهندهی یک عبارت SQL با حروف بزرگ هستند یا کوچک و فاصلهی بین آنها چقدر است و آیا در این بین خطوط جدیدی نیز وجود دارند و امثال آن. خروجی نهایی نرمال شدهی توسط Sql120ScriptGenerator همواره یک شکل است. از این دو قابلیت در برنامهی DNTProfiler استفاده شدهاست.