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

كيفية عمل جملة Multi Select

بدأه محمد فؤاد تركي في 22 نوفمبر 2011 · 23 رد · 1,449 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الزملاء

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

عندما اريد الاستعلام عن بيانات بين مجالين محددين نقوم بكتابة هذا الاسكريبت بصيغتة البسيطة

SELECT     HAdd_Doc
FROM         dbo.AddDoc
WHERE     (HAdd_Doc BETWEEN 1 AND 4)

فماذا لو أردنا جلب مجموعة محددة من البيانات مثال اريد ان اجلب 1 و 7 و 8 و 11 و 800 وهكذا وطبعا بدون استخدام OR صريحة لان هذه الارقام متغيرة

ارجو ان اكون قد وضحت فكرة Multi Selection

وشكراً

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#2

السلام عليكم.

التعليمة تكون كالتالي:

SELECT     HAdd_Doc
FROM         dbo.AddDoc
WHERE     (HAdd_Doc IN (1,7,8,11,800) )
#3

أو :)

SELECT     HAdd_Doc 
FROM       dbo.AddDoc

WHERE     (HAdd_Doc IN (Select numColumn From numTable) )

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

#4

شكراً لكم أخواني

حاولت تطبيق الامثلة المقدمة أعلاه بهذه الطريقة

فقد قمت بانشاء Stored procedure ليؤدي هذا الغرض

Alter proc multi_select

@HAdd_Doc int

as
begin

SELECT     HAdd_Doc
FROM         dbo.AddDoc
WHERE     HAdd_Doc IN (@HAdd_Doc)

end

وعند الاستعلام عن البيانات المراد استخراجها كنتيجة

مثال اردت الاستعلام عن ارقام (1,2,6,5)

فظهر لي هذا الخطأ

USE [WHSYSTEMS]
GO

DECLARE	@return_value int

EXEC	@return_value = [dbo].[multi_select]
		@HAdd_Doc = 1,2

SELECT	'Return Value' = @return_value

GO

Msg 119, Level 15, State 1, Line 4
Must pass parameter number 2 and subsequent parameters as '@name = value'.
 After the form '@name = value' has been used, all subsequent parameters must be passed in the form '@name = value'.

ولا اعرف سبب المشكلة

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 23 نوفمبر 2011 في 08:29

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#5

أنت عرفت المتحول: @HAdd_Doc من نوع int و بالتالي هو سيقبل رقم واحد فقط.

حل المشكلة التي تريدها ممكن بإحدى الطريقتين التاليتين:

1) أن تخزن الأرقام التي تريد البحث عنها في جدول و تستخدم طريقة الأخ : medo_Programming

2) أن تستخدم Synamic SQL Generation و يكون الجراء كالتالي:

create proc multi_select

@HAdd_Doc nvarchar(100)

as
begin

exec('
SELECT HAdd_Doc
FROM dbo.AddDoc
WHERE HAdd_Doc IN (' + @HAdd_Doc + ')')

end
#6

أنا حاولت أركب المثال ده علي الاسكريبت الفعلي اللي انا شغال بيه بس مش ظابط معايا خالص

هذا هو الاسكريبت الاصلي

ALTER proc [dbo].[Rpt_Estemara_two]


@EmpJobStDat as datetime
,@EmpCode as nvarchar (10)
,@CompCode as nvarchar (10)

as
begin

SELECT     dbo.EmpInsur.InsurNumber, max(dbo.Employee.EmpEnFulName)as EmpEnFulName, max(dbo.Employee.EmpBirPlace)as EmpBirPlace, max(dbo.Employee.EmpBirDate)as EmpBirDate, max(dbo.Employee.EmpJobStDat)as EmpJobStDat, 
                      max(dbo.EmpSallaryStructre.PayrollCodeType)as PayrollCodeType, max(dbo.Companies.CompName)as CompName,EMPLOYEE.EMPCODE,
                      max(dbo.InsuranceOffice.InsurOfcCode)as InsurOfcCode , max(dbo.InsuranceOffice.InsurOfcName)as InsurOfcName,EMPLOYEE.CompCode,

                      (Select EMPSALLARYSTRUCTRE.PayrollCodeValue from EMPSALLARYSTRUCTRE 
 where EMPSALLARYSTRUCTRE.EmpCode = EMPLOYEE.EMPCODE
 and EMPSALLARYSTRUCTRE.CompCode = EMPLOYEE.CompCode
 and EMPSALLARYSTRUCTRE.PayrollCode = 'P01') as P01,

 (Select EMPSALLARYSTRUCTRE.PayrollCodeValue from EMPSALLARYSTRUCTRE 
 where EMPSALLARYSTRUCTRE.EmpCode = EMPLOYEE.EMPCODE
 and EMPSALLARYSTRUCTRE.CompCode = EMPLOYEE.CompCode
 and EMPSALLARYSTRUCTRE.PayrollCode = 'P02' ) as P02

FROM         dbo.Employee INNER JOIN
                      dbo.EmpSallaryStructre ON dbo.Employee.CompCode = dbo.EmpSallaryStructre.CompCode AND 
                      dbo.Employee.EmpCode = dbo.EmpSallaryStructre.EmpCode INNER JOIN
                      dbo.EmpInsur ON dbo.Employee.EmpCode = dbo.EmpInsur.EmpCode AND dbo.Employee.CompCode = dbo.EmpInsur.CompCode INNER JOIN
                      dbo.InsuranceOffice ON dbo.Employee.CompCode = dbo.InsuranceOffice.CompCode LEFT OUTER JOIN
                      dbo.Deduction ON dbo.EmpSallaryStructre.CompCode = dbo.Deduction.CompCode AND 
                      dbo.EmpSallaryStructre.PayrollCode = dbo.Deduction.DeductCode LEFT OUTER JOIN
                      dbo.Allowances ON dbo.EmpSallaryStructre.CompCode = dbo.Allowances.CompCode AND 
                      dbo.EmpSallaryStructre.PayrollCode = dbo.Allowances.AllowCode LEFT OUTER JOIN
                      dbo.Companies ON dbo.EmpSallaryStructre.CompCode = dbo.Companies.CompCode

WHERE    (dbo.EmpSallaryStructre.PayrollCode BETWEEN 'p01' AND 'p02')
and dbo.Employee.EmpJobStDat <= @EmpJobStDat
and Employee.RegisterCode <> '4'
and Employee.CompCode = @CompCode
and InsuranceOffice.InsurOfcCode = '1'
Group by dbo.EmpInsur.InsurNumber,EMPLOYEE.EMPCODE,EMPLOYEE.CompCode

order by EmpInsur.InsurNumber

والجزء المطلوب تركيبة مع هذا الاسكريبت هو

WHERE Employee.EmpCode IN (' + @EmpCode  + ')

حاولت اكثر من مرة توفيقة مع الاكسريبت الاصلي ولم استطع

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#7

يجب أن يكون كالتالي:

ALTER proc [dbo].[Rpt_Estemara_two]


@EmpJobStDat as datetime
,@EmpCode as nvarchar (10)
,@CompCode as nvarchar (10)

as
begin
exec('
SELECT     dbo.EmpInsur.InsurNumber, max(dbo.Employee.EmpEnFulName)as EmpEnFulName, max(dbo.Employee.EmpBirPlace)as EmpBirPlace, max(dbo.Employee.EmpBirDate)as EmpBirDate, max(dbo.Employee.EmpJobStDat)as EmpJobStDat, 
                      max(dbo.EmpSallaryStructre.PayrollCodeType)as PayrollCodeType, max(dbo.Companies.CompName)as CompName,EMPLOYEE.EMPCODE,
                      max(dbo.InsuranceOffice.InsurOfcCode)as InsurOfcCode , max(dbo.InsuranceOffice.InsurOfcName)as InsurOfcName,EMPLOYEE.CompCode,

                      (Select EMPSALLARYSTRUCTRE.PayrollCodeValue from EMPSALLARYSTRUCTRE 
 where EMPSALLARYSTRUCTRE.EmpCode = EMPLOYEE.EMPCODE
 and EMPSALLARYSTRUCTRE.CompCode = EMPLOYEE.CompCode
 and EMPSALLARYSTRUCTRE.PayrollCode = ''P01'') as P01,

 (Select EMPSALLARYSTRUCTRE.PayrollCodeValue from EMPSALLARYSTRUCTRE 
 where EMPSALLARYSTRUCTRE.EmpCode = EMPLOYEE.EMPCODE
 and EMPSALLARYSTRUCTRE.CompCode = EMPLOYEE.CompCode
 and EMPSALLARYSTRUCTRE.PayrollCode = ''P02'' ) as P02

FROM         dbo.Employee INNER JOIN
                      dbo.EmpSallaryStructre ON dbo.Employee.CompCode = dbo.EmpSallaryStructre.CompCode AND 
                      dbo.Employee.EmpCode = dbo.EmpSallaryStructre.EmpCode INNER JOIN
                      dbo.EmpInsur ON dbo.Employee.EmpCode = dbo.EmpInsur.EmpCode AND dbo.Employee.CompCode = dbo.EmpInsur.CompCode INNER JOIN
                      dbo.InsuranceOffice ON dbo.Employee.CompCode = dbo.InsuranceOffice.CompCode LEFT OUTER JOIN
                      dbo.Deduction ON dbo.EmpSallaryStructre.CompCode = dbo.Deduction.CompCode AND 
                      dbo.EmpSallaryStructre.PayrollCode = dbo.Deduction.DeductCode LEFT OUTER JOIN
                      dbo.Allowances ON dbo.EmpSallaryStructre.CompCode = dbo.Allowances.CompCode AND 
                      dbo.EmpSallaryStructre.PayrollCode = dbo.Allowances.AllowCode LEFT OUTER JOIN
                      dbo.Companies ON dbo.EmpSallaryStructre.CompCode = dbo.Companies.CompCode

WHERE    Employee.EmpCode IN (' + @EmpCode  + ')
and (dbo.EmpSallaryStructre.PayrollCode BETWEEN ''p01'' AND ''p02'')
and dbo.Employee.EmpJobStDat <= ' + @EmpJobStDat + '
and Employee.RegisterCode <> ''4''
and Employee.CompCode = ' + @CompCode + '
and InsuranceOffice.InsurOfcCode = ''1''
Group by dbo.EmpInsur.InsurNumber,EMPLOYEE.EMPCODE,EMPLOYEE.CompCode

order by EmpInsur.InsurNumber
')
#8

يوجد خطأ هنا

post-46243-024703700 1322042683_thumb.jp

المرفقات
23-11-2011 11-58-29 AM.jpg

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#9

أضف فقط end في سطر جديد

#10
محمد فؤاد تركي كتب:

يوجد خطأ هنا

post-46243-024703700 1322042683_thumb.jp

يجب إضافة End بعد هذا القوس

هناك من يعرف متحول xml ليضع فيه القيم ثم يستعلم من هذا المتحول و هناك من ينشئ جدول مؤقت يضع فيه القيمثم:

... where empCode in (select code from #table1)

و لكن أعجبتني طريقة الأخ عادل بالالتفاف على المشكلة.... :)

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#11

u can run split function like this

SELECT *
FROM table
where id in (SELECT * FROM dbo.udfSplit(@ListStringItem))
#12

أشكركم جميعاً يا أخواني علي الحلول الاكثر من رائعة

فعلا اشتغل الاستعلام و استطعت ان استخرج البيانات بشكل سليم لكن ظهرت لي مشكلة أخري وهي في المتغير

@EmpCode as nvarchar (10)

فأقصي عدد من الــ Digits تستطيع تحملة هذا الحقل من نوع Nvarchar هو 4000 Digits وهذا الحقل ربما يستعوب حوالي خمس آلاف موظف وكود الموظف الواحد يتكون من 5 Digits هذا بخلاف الفواصل بين الارقام فهل يوجد طريقة

لتوسيع هذا المتغير ليستوعب هذا الكم الهائل من البيانات التي سيتم ارسالها عن طريق الباراميتر

ولمزيد من التوضيح ارجو مشاهدة الصورة النهائية التي سيكون عليها هذا الاستعلام لمزيد من التوضيح ومشاهدة الرؤية كاملة

post-46243-034515900 1322127796_thumb.jp

المرفقات
1.jpg

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 24 نوفمبر 2011 في 12:59

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#13

إذا كان عدد الموظفين الذين تريد تمرير أرقامهم كما ذكرت , فأنا أنصح بمحاولة اتباع طريقة الأخ: medo_Programming فهي أنسب.

يومكن أن تستخدم: varchar ( كونه لا يوجد أحرف في المتغير ) فيصبح لديك 8000 حرف بدلاً من 4000 حرف.

#14

8000 لا يكفي

مثال :-

اذا افترضنا ان عدد الموظفين 5000 و كود الموظف يتكون من 5 digits

تبقي النتيجة 5000 * 5 = 25000

و عدد الفواصل ما بين كل كود موظف 2500 فاصلة

يبقي المجموع 27500 Digits وليس 8000

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#15

الطريقة التي اقترحتها تكون فعالة لعدد محدود و صغير.

في حالتك: يمكنك الاستفادة من نفس المنطق الموجود في الفورم و الذي عن طريقه حصلت على 5000 رقم موظف و تطبيقها من طرف سيكوال سيرفر.

#16
Adel Khayata كتب:

إذا كان عدد الموظفين الذين تريد تمرير أرقامهم كما ذكرت , فأنا أنصح بمحاولة اتباع طريقة الأخ: medo_Programming فهي أنسب.

يومكن أن تستخدم: varchar ( كونه لا يوجد أحرف في المتغير ) فيصبح لديك 8000 حرف بدلاً من 4000 حرف.

Adel Khayata كتب:

الطريقة التي اقترحتها تكون فعالة لعدد محدود و صغير.

في حالتك: يمكنك الاستفادة من نفس المنطق الموجود في الفورم و الذي عن طريقه حصلت على 5000 رقم موظف و تطبيقها من طرف سيكوال سيرفر.

السلام عليكم

أخي محمد،

من أين ستحصل على الخمسة آلاف قيمة التي سترسلها من خلال البارامترات؟ لا بد من وجود طريقة عملية أكثر من هذه الطريقة

تم تعديل هذه المشاركة بواسطة byte101 في 24 نوفمبر 2011 في 13:24

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#17
byte101 كتب:

السلام عليكمأخي محمد، من أين ستحصل على الخمسة آلاف قيمة التي سترسلها من خلال البارامترات؟ لا بد من وجود طريقة عملية أكثر من هذه الطريقة

مرة أخري سأشرح الحالة لكي اجاوب علي أسئلتكم

أولاً :- الغرض من هذا هو ان الموظف يريد ان يستعلم عن تقرير استمارة 2 للموظفين ولكن الموظفين المستعلم عنهم ليسوا بالترتيب بمعني اننا لا يمكن ان نقوم بكتابة استعلام (من موظف كذا ........ الي موظف كذا ........... ) فقط

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

أما بخصوص السؤال الثاني

هذه المعلومات تأتي من علي برنامج الاكسل بهذا الشكل مجمعة والمطلوب هو ان نأخذ هذه المجموعة ونسخها ثم لصقها بالباراميتر الموجود بالتقرير كما هو موضح بهذا الشكل الذي قد ارفقته اعلاه لكي يستخرج التقرير بياناته بدلاله مجموعة الاكواد العشوائية الغير تسلسلية ( مرفق صورة من شكل الاكسل المرسل )

اتمني ان اكون قد وضحت المطلوب

ملحوظة :- المطلوب قد تحقق وظهرت النتائج سليمة ولكن حتي حد معين من الــ Digits وذلك لان حقل Nvarchar لا يستوعب اكثر من 4000 Digits فقط

أخي خالد

بالفعل طبقتها داخل سيكوال سيرفر وكانت النتيجة ظهرت لي رسالة خطأ تقول لي ان نوع البيانات NVarchar لا يستوعب اكثر من 4000 Digits فقط لذلك وكل ما اريده ان اجد طريقة لزيادة عدد Digits الموجوده داخل هذا الحقل

مرفق صورة من شكل الاكسل

post-46243-070591700 1322131404_thumb.jp
المرفقات
1.jpg

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#18

Excel.......

قلت لنفسي من المستحيل أن يقوم المستخدم بإدخالها يدويا و لكن لم يخطر ببالي أن يتم نسخها من إكسل،

حسنا،، أظن أن الإجراء الأنسب هو أن تقوم بكتابة كود في البرنامج نفسه يقوم بتخزين هذه القيم في جدول مؤقت (بعد أن يتم حفظها في مصفوفة مثلا) ثم يقوم الإجراء المخزن (في قاعدة البيانات) باستخدام الطريقة التي ذكرها الإخوة سابقا

أي:

... where EmpCode in (select empCode from tempTable)

تم تعديل هذه المشاركة بواسطة byte101 في 24 نوفمبر 2011 في 13:54

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#20

بارك الله فيك أخي الفاضل طارق كنت مستنيك من زمان :lol:

انا فعلاً بحثت ووجدت هذا الحل وكما تشاهد في الصورة عموما سأحاول تجربة هذا الحل بعد الــ Week end ان شاء الله وسأبلغك بالنتائج بعد الانتهاء من تنفيذ هذا الحل

وشكراً للجميع علي المشاركة الفعالة

post-46243-005349800 1322145157_thumb.jp

المصدر

http://www.w3schools.com/sql/sql_datatypes.asp

المرفقات
1.jpg

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 24 نوفمبر 2011 في 17:34

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#21

ابحث ربما وجت طريقه تقرا من من الاكسل من السكول مباشرا مثل openrowset هذا افضل

#22

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

في حالات مثل هذه إذا كنت تستخدم SQL Server 2008 أنصح باستخدام الـ Table-Valued Parameters:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

هو طبعا الـ Dynamic SQL جيد لاشك يفي بالغرض تماما بس يعقد الـ Stored Procedure Script في بعض الأماكن ..

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#23

أخي اذا كانت المشكله في المساحة إذن استخدم ntext فهو أكبر متغير http://msdn.microsoft.com/en-us/library/ms187993.aspx

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

#24

أشكركم جميعاً

تم حل الاشكال باستخدام

 Nvarchar (MAX)

certifiedj.jpg

 

 

Image Hosted by ImageShack.us

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