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

تجزئةالاسم الى 4حقول

بدأه sjaser1 في 10 يناير 2011 · 5 رد · 560 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد كوداستعلام qure يقوم بقراءة حقل varchar()في جدول

ثم يحوله الى حقول متعددة

اعتمادا على الفراغبين الكلمات

مثال حقل A = فهد علي محمد

--------------------------------

بعدالتحويل

b= فهد

c =علي

d = محمد

استغفر الله وأتوب اليه

#2

مممم.. الحقل، هل تقصد به "السجل record" ؟

declare @s nvarchar(255)
select @s = N'فهد علي محمد'
select * from split(@s,1,0)

هذا مثال.

split() عبارة عن function عليك إنشاؤها.

CREATE FUNCTION SPLIT
(
  @s nvarchar(max),
  @trimPieces bit,
  @returnEmptyStrings bit
)
returns @t table (val nvarchar(max))
as
begin

declare @i int, @j int
select @i = 0, @j = (len(@s) - len(replace(@s,' ','')))

;with cte 
as
(
  select
    i = @i + 1,
    s = @s, 
    n = substring(@s, 0, charindex(' ', @s)),
    m = substring(@s, charindex(' ', @s)+1, len(@s) - charindex(' ', @s))

  union all

  select 
    i = cte.i + 1,
    s = cte.m, 
    n = substring(cte.m, 0, charindex(' ', cte.m)),
    m = substring(
      cte.m,
      charindex(' ', cte.m) + 1,
      len(cte.m)-charindex(' ', cte.m)
    )
  from cte
  where i <= @j
)
insert into @t (val)
select pieces
from 
(
  select 
  case 
    when @trimPieces = 1
    then ltrim(rtrim(case when i <= @j then n else m end))
    else case when i <= @j then n else m end
  end as pieces
  from cte
) t
where
  (@returnEmptyStrings = 0 and len(pieces) > 0)
  or (@returnEmptyStrings = 1)
option (maxrecursion 0)

return

end

GO

بعد التنفيذ ستكون النتيجة:

+-------------+
| val         |
+-------------+
| فهد         |
| علي         |
| محمد         |
+-------------+

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

اخي الكريم Xacker

اشكرك على الرد

لكن لي طلب اولا اريد الحل على sqlserver

اذا كان كذلك كيف او اين اضع الفنكشن وكيف استدعيها

ارجو الشر ح بطريقة مبسطة لانه ليس عندي خلفية عن الفنكشن...

لك تحياتي

استغفر الله وأتوب اليه

#4

أعلم أنه SQL server وإلا لماذا تضعه في ASP.NET :)

لو كان الطلب خاص بـ MySQL لكنت قتلتك الآن .. :D *أمزح*

بالنسبة لإنشاء الـ function يكفي أن تقوم بتنفيذ الكود أدناه كـ SQL query كأي استعلام SELECT أو INSERT ... إلخ، على القاعدة لديك وسيتم إنشاؤها في المكان المناسب لها.

طبعاً يجب أن تنفذها من حساب يملك الصلاحيات الكافية على القاعدة (حساب sa مثلاً).

هل القاعدة لديك على الجهاز أم موجودة حالياً على موقع؟

هل تستخدم Enterprise Manager أم Management Studio لإدارة القاعدة؟

بالمناسبة ما إصدار SQL server الذي تستخدمه؟ 2000/2005/2008؟

هذه المعلومات ستساعدني في إرشادك للطريقة بشكل أبسط إن كان ما كتبته في الأعلى غامض لك (لكن أتمنى أن تحاول بنفسك فالفائدة في النهاية ستعود عليك في تعلم أمور جديدة من خلال التجربة والخطأ -trial & error-)

بالتوفيق

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

اشكرك على التجاوب

قمت بحفظ Function

داخل Table - Valued Function

باسم SPLIT

وعند استدعائها من ال View يعطي Error

هذه جملة الاستعلام

-----------------------------------------------------------------

SELECT dbo.SPLIT(StName) AS StName

FROM dbo.StudentBasicInfos

------------------------------------------------------------------

علما اني اعمل على SqlServer2005 Mangmentstudio

استغفر الله وأتوب اليه

#6

إن كان الـ View بالاسم StudentBasicInfos يعيد أكثر من سجل واحد من البيانات فعليك إنشاء حلقة والمرور على كل سجل على حدة.

قمت في ردي بوضع مثال لاستخدام التابع:

declare @s nvarchar(255)
select @s = N'فهد علي محمد'
select * from split(@s,1,0)

بفرض أن StudentBasicInfos يعيد سجل واحد من البيانات فقط فيمكن تعديل المثال السابق ليصبح بالشكل:

declare @s nvarchar(255)
select @s = StName from dbo.StudentBasicInfos
select * from split(@s,1,0)

طبعاً ضمن الحلقة سيكون بإمكانك إدخال البيانات العائدة من الاستعلام:

select * from split(@s,1,0)

ضمن جدول مؤقت وفي النهاية تقوم بتنفيذ استعلام يجلب لك جميع البيانات بعد أن انتهيت منها.

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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