آموزش QUOTENAME در TSQL نامگذاری امن اشیا SQL Server

آموزش کامل تابع QUOTENAME در T-SQL برای نامگذاری صحیح

تابع QUOTENAME در SQL Server، جداکننده‌هایی را به یک رشته از کاراکترها اضافه می‌کند تا آن رشته به یک شناسه نقل قول‌دار معتبر SQL Server تبدیل شود. استفاده از این تابع به حذف خطاها کمک می‌کند، به ویژه زمانی که نام جداول، ستون‌ها یا سایر اشیاء دیتابیس شامل کاراکترهای خاصی مانند فاصله‌ها، خط تیره، یا کلمات کلیدی رزرو شده باشد که می‌تواند باعث شکست کوئری شود. این تابع همچنین هنگام تولید کوئری‌های SQL دینامیک بسیار مفید است، زیرا با خارج کردن صحیح ورودی کاربر که ممکن است به عنوان یک شناسه استفاده شود، به پیشگیری از حملات SQL Injection کمک می‌کند.

ساختار تابع QUOTENAME به شرح زیر است:

QUOTENAME ( ‘character_string’ [ , ‘quote_character’ ] )

پارامترهای این تابع عبارتند از:

  • character_string: رشته کاراکتری یونیکد که باید نقل قول‌دار شود. حداکثر طول این رشته ۲۵۶ کاراکتر است. اگر طول رشته از ۲۵۶ کاراکتر بیشتر باشد، تابع NULL برمی‌گرداند.
  • quote_character: کاراکتر اختیاری که به عنوان جداکننده استفاده می‌شود. این کاراکتر می‌تواند یک علامت نقل قول تکی (')، علامت نقل قول دبل (")، براکت مربعی ([])، یا بک‌تیک (`) باشد. اگر این پارامتر حذف شود، به طور پیش‌فرض از براکت‌های مربعی استفاده می‌شود.

بیایید به چند مثال از نحوه استفاده از تابع QUOTENAME نگاهی بیندازیم.

مثال ۱: جداکننده پیش‌فرض (براکت‌های مربعی)

به طور پیش‌فرض، تابع QUOTENAME از براکت‌های مربعی ([]) به عنوان جداکننده استفاده می‌کند. در اینجا مثالی را مشاهده می‌کنید:


SELECT QUOTENAME('My Table Name');

خروجی نشان می‌دهد که رشته ‘My Table Name’ در براکت‌های مربعی محصور شده و آن را به یک شناسه نقل قول‌دار معتبر تبدیل می‌کند.

مثال ۲: استفاده از علامت نقل قول تکی

در صورت نیاز می‌توانید یک quote_character متفاوت را مشخص کنید. به عنوان مثال، برای استفاده از علامت نقل قول تکی ('):


SELECT QUOTENAME('Another Table', '''');

توجه داشته باشید که برای مشخص کردن کاراکتر نقل قول تکی به عنوان جداکننده، باید از دو علامت نقل قول تکی ('''') در داخل فراخوانی تابع استفاده کنید، زیرا یک علامت نقل قول تکی برای جدا کردن خود رشته لیترال استفاده می‌شود.

مثال ۳: استفاده از علامت نقل قول دبل

به همین ترتیب، برای استفاده از علامت نقل قول دبل ("):


SELECT QUOTENAME('Yet Another Table', '"');

مثال ۴: استفاده از بک‌تیک

بک‌تیک‌ها (`) نیز می‌توانند استفاده شوند، که به ویژه در برخی سیستم‌های پایگاه داده رایج هستند اما در SQL Server نیز به عنوان جداکننده پشتیبانی می‌شوند:


SELECT QUOTENAME('Table with `Backticks`', '`');

توجه کنید که چگونه بک‌تیک داخلی با دو برابر کردن آن در داخل رشته نقل قول‌دار، escape می‌شود.

مثال ۵: quote_character نامعتبر

اگر یک quote_character نامعتبر (مانند کاراکتری که یک جداکننده شناخته شده نیست) ارائه دهید، QUOTENAME مقدار NULL را برمی‌گرداند.


SELECT QUOTENAME('Invalid Quote Character', '(');

پرانتزها جداکننده‌های معتبری برای شناسه‌های SQL Server نیستند، از این رو نتیجه NULL است.

مثال ۶: مدیریت کاراکترهای خاص و کلمات کلیدی

این تابع به ویژه هنگام کار با نام اشیاء دیتابیس که حاوی فاصله هستند یا کلمات کلیدی SQL Server محسوب می‌شوند، مفید است. به عنوان مثال، اگر جدولی با نام Order Details دارید (که یک رویه بد است اما گاهی اوقات با آن مواجه می‌شوید):


-- این کوئری با خطا مواجه می‌شود
-- SELECT * FROM Order Details;

-- این کوئری کار می‌کند
SELECT * FROM [Order Details]; 

-- این کوئری نیز اگر به صورت دینامیک استفاده شود، کار می‌کند
SELECT * FROM QUOTENAME('Order Details'); 

در حالی که کوئری گرفتن مستقیم از QUOTENAME('Order Details') به عنوان نام جدول نحوه استفاده آن نیست، نکته اینجاست که QUOTENAME رشته نقل قول‌دار صحیح (مانند [Order Details]) را فراهم می‌کند که سپس می‌تواند در SQL دینامیک استفاده شود.

مثال ۷: استفاده از QUOTENAME در SQL دینامیک

یکی از قدرتمندترین کاربردهای QUOTENAME در ساخت کوئری‌های SQL دینامیک است. این کار تضمین می‌کند که ورودی‌های ارائه شده توسط کاربر (مانند نام ستون‌ها، نام جداول) به درستی escape شوند و از خطاهای سینتکسی و آسیب‌پذیری‌های SQL Injection جلوگیری می‌کند.


DECLARE @tableName NVARCHAR(256) = 'My Table with Spaces';
DECLARE @columnName NVARCHAR(256) = 'Column Name';
DECLARE @sql NVARCHAR(MAX);

SET @sql = 'SELECT ' + QUOTENAME(@columnName) + ' FROM ' + QUOTENAME(@tableName);

PRINT @sql;
-- EXEC sp_executesql @sql; -- برای اجرا، کامنت را بردارید

در اینجا، QUOTENAME به طور ایمن نام‌های جدول و ستون را در جداکننده قرار می‌دهد و SQL دینامیک را در برابر شناسه‌های مشکل‌ساز قوی می‌کند. این یک رویه حیاتی برای امنیت SQL است.

مثال ۸: استفاده از QUOTENAME با نماهای سیستمی

همچنین می‌توانید QUOTENAME را در ترکیب با نماهای سیستمی (مانند sys.tables یا sys.columns) برای تولید اسکریپت‌ها یا انجام عملیات شماتیک به صورت قابل اعتماد استفاده کنید.


SELECT 
    'DROP TABLE ' + QUOTENAME(name) + ';' AS DropTableCommand
FROM sys.tables
WHERE name LIKE 'TestTable%';

این مثال، دستورات DROP TABLE را برای جداولی که نام آن‌ها با ‘TestTable’ شروع می‌شود، تولید می‌کند و تضمین می‌کند که اگر هر یک از این نام‌های جدول دارای فاصله یا کاراکترهای خاص باشند، به درستی مدیریت می‌شوند.

“`

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟