الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Stored Procedre Dynamic Table Name

مغلق
بدأه Moustafa Karrar في 24 يناير 2007 · 10 رد · 1,304 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدى مشكله و اظن انها ترجع لقله خبرة و معرفه السيكوال لانى مبرمج فيجوال بيزيك و سى شارب مبتدئ بعض الشئ

انى اريد ان اصنع ستورد بروسيدشر على ن يكون اسم الجدول الذى سيتم عليه التعامل سواء بالاضافه او التعديل او الحذف او الاختيار متغير بمعنى ان امرر للستورد بروسيدشر باراميتر به اسم الجدول و هذا الامر يصلح مع الفانكشن التى ترجع جدول و تكون على سبيل المثال بهذا الشكل

SELECT * 
FROM fn_FindReports('11234')
GO

حيث fn_FindReports هى الفانكشن و الباراميتر هو باراميتر هو باراميتر يتم استخدامه بداخلها و لكن المشكله انى لازلت يجب ان استخدم اسم ثابت لجدول بداخل الفانكشن

و قد حاولت ان صنع فانكشن تقوم بهذا الامر و لكن لم استطع اكمالها فرجاء التكرم و المساعده

 Create FUNCTION dbo.Function3 
	(
	@tblName varchar(50)
	)
RETURNS @tbl TABLE (JobID int primary key,JobName nvarchar(50))
AS
BEGIN 
insert @tbl
 select name from .dbo.sysobjects where id = object_id(@tblName) and OBJECTPROPERTY(id, N'IsUserTable') = 1
	RETURN
end

و جزاكم الله خيرا

لا علم لنا إلا ما علمتنا

و قل رب زدنى علما

و لئن شكرتم لأزيدنكم

#2

السلام عليكم,,,

راجع هذا الرابط

من هنا

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#3

السلام عليكم,,,,

الاخ الكريم سولو

الرابط الذى ارسلته مفيد جدا و جزاك الله خيرا

و لكنه لم يجب عن المطلوب للاسف

ساعطى مثالا ابسط على المشكله التى تواجهنى

افترض اننى فى اكتب كوماند سيكول فى سى شارب هذ الكوماند هو

OdbcCommand cmdFill = new OdbcCommand("SELECT * FROM " + tblName, CN);

و هذا الامر السابق بعون الله و توفيقه صحيح

و كما تلاحظون ان اسم الجدول الذى يتم الاختيار منه متغير على حسب قيمه المتغير tblName الذى نوعه String

و المشكله هنا انى اريد نفس الفاعليه و لكن باستخدام ستورد بروسيدشر واحد او فانكشن و ايا يكن بدلا من صنع 30 او 50 ستورد بروسيدشر تبعا لعدد الجداول التى اريد صنع هذا الكوماند لها و اخشى ان الامر لن يتوقف على 50 ستورد بروسيدشر فى المشروع الذى انا بصصده الان فحتى الان مطلوب على الاقل صنع 90 ستورد بروسيدشر و قد استطعت بالفعل برمجيا من خلال سى شارب ان اعالج هذا الامر عن طريق الاستعاضه عن هذا العدد الهائل من الستورد بروسيدشر عن طريق الاستعانه بمتغيرات و اضافتها الى السلسله النصيه للامر و لكن يقال ان هذه الطريقه لن تكون فى صالح البرنامج من حيث السرعه فى العمل و لذلك فهذا هو المطلوب منى و قد كما رايتم بالاعلى محاولاتى لصنع ستورد بروسيدشر يستخدم فانكشن تقوم بعمل المتغير.

و جزاكم الله خيرا على وقتكم و علمكم

تم تعديل هذه المشاركة بواسطة Moustafa Karrar في 24 يناير 2007 في 19:43

لا علم لنا إلا ما علمتنا

و قل رب زدنى علما

و لئن شكرتم لأزيدنكم

#4
اقتباس
و لكن يقال ان هذه الطريقه لن تكون فى صالح البرنامج من حيث السرعه فى العمل

بالنسبة لتمرير متحول الى stored procedure لكي يتم وضعها في تعليمة select فهذا ايضا سوف يبطئ من سرعة تنفيذ الاجرائية لانه سوف يتم عمل parse لها عند كل طلب

هناك مشاركة عن فوائد ال stored procedure في المنتدى ابحث عنها سوف تفيدك في هذا المجال

الان لفعل ما تريد قم بتمرير بارمييتر الى الاجرائية المخزنة بحيث يحتوي على اسم الجدول المطلوب جلب النتائج منه

على سبيل المثال التالي:

create procedure anyname
@tableName
as
select * from @tablename

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#5

السلام عليكم,,,,

شكرا لك أخ وائل و لكن الكود الذى كتبته مجرب بالفعل و كلمه FROM لا تأخذ بعدها الا Object أو Function

و جارى البحث عن مشاركه الستورد بروسيدشر

لا علم لنا إلا ما علمتنا

و قل رب زدنى علما

و لئن شكرتم لأزيدنكم

#6

السلام عليكم ورحمة الله وبركاته

أخي وائل الإجرائية اللي كتبتها لن تعمل .. والسبب ببساطة أنك تمرر متحول نصي ..

وليس جدولاً للاستعلام منه .. :)

على كل جزاك الله خيراً على محاولتك مساعدة أخونا مصطفى ..

وللحصول على ما يطلبه الأخ الكريم عليه بكتابة إجرائية كالتالي :

مثلاً الإجرائية التالية تستخدمها لتفريغ سجلات أي جدول تمرر اسمه كوسيط للإجراء ..

Create Proc prcDelete

   @TableName SysName   

AS

   Declare @SQL Nvarchar(4000)

   Set @SQL = 'Delete ' + @TableName

   Exec(@SQL)

Go

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#7

السلام عليكم ,,,,,

الاخ الكريم imadouzoun شكرا لك على المشاركه و لدى منك رجاء أخير ماذا بشان جلب بيانات او اضافتها او تعديلها ؟ هل يتم استخدام نفس الطريقه

و جزاكم الله كل خير لكل من شارك

لا علم لنا إلا ما علمتنا

و قل رب زدنى علما

و لئن شكرتم لأزيدنكم

#8

أنا بتوقع إنه

يمكنك عمل إضافة و تعديل و حذف بإستخدام

Execute ( @Sql )

و لكن الإستعلام لا يمكن تحقيقه

لإنه لما بتروح على DataSet و تضيف هذا الإجراء

سيضعه كـ Query و إذا شغلته لن يرجع أي بيانات

و لكن إذا شغلته ببيئة السكوال سيعمل

سلام

تم تعديل هذه المشاركة بواسطة Desigen في 25 يناير 2007 في 08:29

#9
اقتباس
أخي وائل الإجرائية اللي كتبتها لن تعمل .. والسبب ببساطة أنك تمرر متحول نصي ..

معك حق لن تعمل :D لم انتبه الى انني استعلم من متحول نصي يبدوا انني خرفنت:^)

اقتباس
اذا بشان جلب بيانات او اضافتها او تعديلها ؟ هل يتم استخدام نفس الطريقه

اذا كنت لا تريد ان تضيف اجرائية مخزنة لكل تعليمة فافضل ان تضع اجرائيات في لغة البرمجة من اجل عمل ما تريد, لانّ الفائدة من ال stored procedure لن تتحقق عند استخدام التابع Execute

مثلا ان تضيف:

executescaler: و هي اجرائية يتم تمرير لها تعليمة sql ليتم تنفيذها و تعيد قيمة وحيدة

executeNonquery: و هي اجرائية تمرر لها تعليمة sql ليتم تنفيذها و لا تعيد قيمة مثل(insert,update,delete)

executeReader: و هي اجرائية تمرر لها تعليمة sql ليتم تنفيذها و تعيد من نمط DataTable مثلا...

و لكن اذا اردت رأيي: قم بوضع اجرائية مخزنة لعمل كل شيئ هكذا يكون افضل و لا ضير من كثرتها :)

اقتباس
و جارى البحث عن مشاركه الستورد بروسيدشر

هل من المنطق تحويلكل جمل SQL إلى StoredProcedure؟

تم تعديل هذه المشاركة بواسطة Wael Dalloul في 25 يناير 2007 في 11:21

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#10

السلام عليكم,,,,,

جزاك الله خيرا اخ وائل و لكنى لا استطيع فهم ماذا تقصد بالضبط بـ Execute

اقتباس
اذا كنت لا تريد ان تضيف اجرائية مخزنة لكل تعليمة فافضل ان تضع اجرائيات في لغة البرمجة من اجل عمل ما تريد, لانّ الفائدة من ال stored procedure لن تتحقق عند استخدام التابع Execute

لانى بالفعل استخدمها فى تنفيذ الستورد بروسيدشر من لغه البرمجه حيث استخدم ExecuteNonquery

و استطيع ان اقول لكم رايى الان بعد تجربه الستورد بروسيدشر الذى افادنا به الاخ imadouzoun

فى التعديل و الاضافه و الحذف مع اتباع نفس الطريقه مع اسماء الاعمده و هى فعاله بتوفيق الله و عونه

وان شاء الله اظن انها ستعمل فى حاله جلب بيانات

و اليكم أمثله على أكواد التعديل و الحذف و الاضافه

الاضافه

CREATE Proc stInsertOneField

	@TableName  SysName ,  
	@FieldName  Sysname,
   	@FieldValue Nvarchar(10)
AS

   Declare @SQL Nvarchar(4000)

   Set @SQL = 'INSERT INTO ' + @TableName + ' (' +  @FieldName + ') VALUES ('''+ @FieldValue + ''')'   

   Exec(@SQL)


GO

التعديل

CREATE Proc stUpdateOneField

	@TableName  SysName ,  
	@FieldName  Sysname,
	@KeyField   SysName,
   	@FieldValue Nvarchar(10),
	@KeyFieldValue nvarchar(10)
AS

   Declare @SQL Nvarchar(4000)

   Set @SQL = 'UPDATE ' + @TableName + ' SET ' +  @FieldName + ' = '''+ @FieldValue + ''' WHERE ' + @KeyField + '= ' + @KeyFieldValue  + '' 

   Exec(@SQL)
GO

الحذف

CREATE Proc stDeleteOneField

	@TableName  SysName ,  
	@KeyField   SysName,
	@KeyFieldValue nvarchar(10)
AS

   Declare @SQL Nvarchar(4000)

   Set @SQL = 'DELETE ' + @TableName + ' WHERE ' +  @KeyField + ' = ' + @KeyFieldValue  + ''

   Exec(@SQL)
GO

و لن يختلف الامر اذا كان نوع العمود رقمى او نصى او يا كان لان نوع البيان الذى يوضع للمتغير مرتبط بالمتغير SQL@

جزاكم الله خيرا بعلمكم

لا علم لنا إلا ما علمتنا

و قل رب زدنى علما

و لئن شكرتم لأزيدنكم

#11
اقتباس
و لكنى لا استطيع فهم ماذا تقصد بالضبط بـ Execute

اقصد ان تقوم بعمل ثلاثة اجرئيات الهدف منها تنفيذ جملة SQL يتم تمريرها لها, ووضعنا ثلاثة اجرائية و ذلك حسب نوع النتائج الراجعة من الاجرائية

هذه الاجرائيات سوف تقوم بعملها بيدك, اي تختلف عن الموجودة في ال command مثلاً

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

هذا الموضوع مغلق.

مواضيع مشابهة