السلام عليكم
اريد كوداستعلام qure يقوم بقراءة حقل varchar()في جدول
ثم يحوله الى حقول متعددة
اعتمادا على الفراغبين الكلمات
مثال حقل A = فهد علي محمد
--------------------------------
بعدالتحويل
b= فهد
c =علي
d = محمد
السلام عليكم
اريد كوداستعلام qure يقوم بقراءة حقل varchar()في جدول
ثم يحوله الى حقول متعددة
اعتمادا على الفراغبين الكلمات
مثال حقل A = فهد علي محمد
--------------------------------
بعدالتحويل
b= فهد
c =علي
d = محمد
استغفر الله وأتوب اليه
مممم.. الحقل، هل تقصد به "السجل 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
اخي الكريم Xacker
اشكرك على الرد
لكن لي طلب اولا اريد الحل على sqlserver
اذا كان كذلك كيف او اين اضع الفنكشن وكيف استدعيها
ارجو الشر ح بطريقة مبسطة لانه ليس عندي خلفية عن الفنكشن...
لك تحياتي
استغفر الله وأتوب اليه
أعلم أنه 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
اشكرك على التجاوب
قمت بحفظ Function
داخل Table - Valued Function
باسم SPLIT
وعند استدعائها من ال View يعطي Error
هذه جملة الاستعلام
-----------------------------------------------------------------
SELECT dbo.SPLIT(StName) AS StName
FROM dbo.StudentBasicInfos
------------------------------------------------------------------
علما اني اعمل على SqlServer2005 Mangmentstudio
استغفر الله وأتوب اليه
إن كان الـ 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)
ضمن جدول مؤقت وفي النهاية تقوم بتنفيذ استعلام يجلب لك جميع البيانات بعد أن انتهيت منها.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget