إنشاء الدوال القياسية
الدوال القياسية هي أدوات أساسية في SQL Server تتيح لك تغليف المنطق القابل لإعادة الاستخدام وإرجاع قيمة واحدة. يمكنك استخدامها مباشرة في SELECT العبارات والجمل WHERE وتعبيرات T-SQL الأخرى، مما يجعل استفساراتك أكثر قابلية للصيانة وكودك أكثر مرونة.
فهم أساسيات الدوال القياسية
تقبل دالة قياسية صفرا أو أكثر من المعلمات وتعيد قيمة واحدة من نوع بيانات محدد. على عكس الإجراءات المخزنة، يمكن تضمين الدوال القياسية مباشرة في تعبيرات SQL أينما استخدمت عمودا أو متغيرا.
تشمل الخصائص الرئيسية للدوال القياسية قدرتها على قبول معلمات الإدخال، وإجراء الحسابات أو التحولات، وإعادة قيمة واحدة فقط. أنت تعرف نوع البيانات العائد بشكل صريح في تعريف الدالة، والذي يقوم SQL Server بالتحقق منه عند وقت الإنشاء.
عندما تنشئ دالة قياسية، فأنت تنشئ قطعة منطقية قابلة لإعادة الاستخدام يمكن للمطورين الآخرين استدعاؤها في قاعدة البيانات. هذا يعزز إعادة استخدام الكود ويساعد في الحفاظ على الاتساق عبر تطبيقاتك.
تعريف بناء الدوال القياسية
لإنشاء دالة قياسية، تستخدم العبارة CREATE FUNCTION مع مكونات نحوية محددة. تشمل البنية الأساسية اسم الدالة، والمعلمات، ونوع الإرجاع، وجسم الدالة.
إليك نمط النحو الأساسي:
CREATE FUNCTION schema_name.function_name
(
@parameter1 datatype,
@parameter2 datatype
)
RETURNS return_datatype
AS
BEGIN
-- Function logic here
RETURN @result
END
يحدد الجملة RETURNS نوع البيانات للقيمة الوحيدة التي تعيدها الدالة. داخل الكتلة BEGIN...END ، تكتب منطق T-SQL الخاص بك وتستخدم RETURN عبارة لإرسال النتيجة.
على سبيل المثال، يمكنك إنشاء دالة بسيطة تحسب ضريبة المبيعات:
CREATE FUNCTION dbo.CalculateSalesTax
(
@Amount DECIMAL(10,2),
@TaxRate DECIMAL(5,4)
)
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @TaxAmount DECIMAL(10,2)
SET @TaxAmount = @Amount * @TaxRate
RETURN @TaxAmount
END
تقبل هذه الدالة معاملين وتعيد مبلغ الضريبة المحسوب. يمكنك استخدام هذه الدالة في أي SELECT بيان.
تنفيذ الدوال القياسية باستخدام منطق الأعمال
تتفوق الدوال القياسية في تلخيص قواعد العمل والحسابات التي تحتاج إلى تطبيقها باستمرار عبر قاعدة بياناتك. مع الدوال القياسية، تقوم بمركزية المنطق الذي قد يكرر في عدة استعلامات أو كود تطبيق.
تخيل سيناريو تحتاج فيه إلى حساب مدة الموظف بالسنة. تنشئ دالة قياسية تقبل تاريخ التوظيف وتعيد عدد السنوات الكاملة:
CREATE FUNCTION dbo.GetEmployeeTenure
(
@HireDate DATE
)
RETURNS INT
AS
BEGIN
DECLARE @Tenure INT
SET @Tenure = DATEDIFF(YEAR, @HireDate, GETDATE())
RETURN @Tenure
END
يمكنك استخدام هذه الوظيفة في الاستعلامات لعرض معلومات المنصب:
SELECT
EmployeeName,
HireDate,
dbo.GetEmployeeTenure(HireDate) AS YearsOfService
FROM Employees
WHERE dbo.GetEmployeeTenure(HireDate) >= 5
يضمن هذا النهج حساب ثابت للتثبيت في قاعدة بياناتك. إذا تغيرت قواعد العمل، تقوم بتعديل الدالة مرة واحدة بدلا من تحديث عدة استعلامات.
ملاحظة
تستخدم GETDATE()هذه الدالة ، مما يجعلها غير حتمية. لا يمكن استخدام الدوال غير الحتمية في العروض المفهرسة أو الفهارس على الأعمدة المحسوبة. بالنسبة للسيناريوهات التي تتطلب الحتمية، قم بتمرير التاريخ الحالي كمعامل بدلا من ذلك.
تطبيق أفضل الممارسات للدوال العددية
عندما تنشئ دوال قياسية، تساعد عدة أفضل الممارسات في ضمان الأداء الأمثل وسهولة الصيانة. فهم هذه الممارسات يساعدك على تجنب الأخطاء الشائعة وإنشاء وظائف فعالة وموثوقة.
أولا، حافظ على الدوال القياسية لديك حتمية كلما أمكن. الدالة الحتمية دائما تعطي نفس النتيجة مع نفس معلمات الإدخال. الدوال التي تشير إلى دوال التاريخ/الوقت أو الجداول في النظام غير حتمية وقد تمنع بعض تحسينات الاستعلام.
أيضا، تجنب الآثار الجانبية على وظائفك. يجب ألا تعدل الدوال القياسية حالة قاعدة البيانات أو تعتمد على موارد خارجية. هذا القيد موجود لأن SQL Server قد ينفذ الدوال عدة مرات أو بترتيبات مختلفة عما تتوقعه.
وأخيرا، كن واعيا لتأثيرات الأداء. عندما تستخدم دالة قياسية في جملة WHERE أو SELECT قائمة ذات جداول كبيرة، قد يقوم SQL Server بتنفيذ الدالة لكل صف. وهذا يمكن أن يؤثر بشكل كبير على أداء الاستعلام. في مثل هذه السيناريوهات، اعتبر الدوال ذات القيم الجدول المتدرجة كبديل.
إليك مثال على دالة قياسية مصممة جيدا تتبع هذه الممارسات:
CREATE FUNCTION dbo.FormatPhoneNumber
(
@PhoneNumber VARCHAR(10)
)
RETURNS VARCHAR(14)
AS
BEGIN
DECLARE @FormattedNumber VARCHAR(14)
IF LEN(@PhoneNumber) = 10
SET @FormattedNumber = '(' + SUBSTRING(@PhoneNumber, 1, 3) + ') ' +
SUBSTRING(@PhoneNumber, 4, 3) + '-' +
SUBSTRING(@PhoneNumber, 7, 4)
ELSE
SET @FormattedNumber = @PhoneNumber
RETURN @FormattedNumber
END
هذه الدالة حتمية، ولا لها آثار جانبية، وتقوم بتحويل مباشر. يتعامل مع الإدخال غير الصحيح بسلاسة عن طريق إعادة القيمة الأصلية عندما لا يتطابق رقم الهاتف مع التنسيق المتوقع.
تعديل وإدارة الدوال العددية
بعد إنشاء دالة قياسية، يمكنك تعديل تعريفها باستخدام الجملة ALTER FUNCTION . الصياغة ALTER FUNCTION تعكس CREATE FUNCTION الدالة لكنها تسمح لك بتغيير الدالة دون إسقاطها وإعادة إنشائها، مما يحافظ على الأذونات والتبعيات.
ALTER FUNCTION dbo.CalculateSalesTax
(
@Amount DECIMAL(10,2),
@TaxRate DECIMAL(5,4)
)
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @TaxAmount DECIMAL(10,2)
-- Updated logic with rounding
SET @TaxAmount = ROUND(@Amount * @TaxRate, 2)
RETURN @TaxAmount
END
لإزالة دالة عددية، تستخدم الجملة DROP FUNCTION :
DROP FUNCTION IF EXISTS dbo.CalculateSalesTax
الجملة IF EXISTS تمنع الأخطاء إذا لم تكن الدالة موجودة، وهذا مفيد في سكريبتات النشر. قبل إسقاط دالة، تحقق من عدم اعتماد أي كائنات أخرى في قاعدة البيانات عنها عن طريق التحقق من عروض النظام مثل sys.sql_expression_dependencies.