PDA

View Full Version : ارسال یک کد به تابع و دریافت نتیجه جستجو با یک استرینگ



mehdi.fni
سه شنبه 18 آذر 1393, 12:20 عصر
سلام خدمت تمامی دوستان
دوستان من یک تابع میخوام که یک کد مثلا 10 رقمی را بگیره و نتیجه جستجو با استرینگ بدهد
جدول من از نوع درختی میباشد و سه فیلد id,pid,fname دارد
ابتدا از فرزند شروع میکنیم و تا هنگامی که به جد نرسیدیم ادامه میدهیم و دست آخر اینجوری نتیجه را بر میگردانیم
فیلد pid شماره id پدر را دارد
نتیجه با اینجوری برگرده درخت/تنه/ساقه/برگ/مویرگ.......
یا اتومبیل/موتور اتومبیل/کاربراتور/ژیگلور

تعداد سطح نا مشخص خواهد بود
میشه منو راهنمایی کنید چطور از function یا StoredProcedure که با while کار کنه استفاده کنم و آیا راه بهتری هم هست ؟

مرتضی تقدمی
پنج شنبه 20 آذر 1393, 07:39 صبح
سلام
اين كد 10 رقمي چي هست؟!
با فرض جدول زير اين SP درست كار ميكنه و اون چيزي كه شما ميخواين رو ميده:


id pid fname
1 0 اتومبيل
2 1 موتور
3 2 كاربراتور
4 3 ژيگلور
5 4 قطعه 1
6 5 قطعه 2
7 6 قطعه 3


create proc getName
@id int
as
declare @pid int = -1
declare @str nvarchar(1000) = ''
select top 1 @str = fname from tbl_test2 where id = @id

while @pid <> 0
begin
select top 1 @pid = pid from tbl_test2 where id = @id
select top 1 @str = fname + '/'+ @str from tbl_test2 where id = @pid
set @id = @pid
end

select @str as a

خروجي با ورودي id = 7:

اتومبيل/موتور/كاربراتور/ژيگلور/قطعه 1/قطعه 2/قطعه 3

موفق باشيد

mehdi.fni
پنج شنبه 20 آذر 1393, 10:52 صبح
از جواب شما تشکر میکنم و اگر امکان دارد 2 سوال دیگر مطرح میکنم
آیا میشد فقط از یک select استفاده کرد ؟
دوم اینکه اگر در جدولی یک ستون کد کالا یا گروه های فرعی کالا داشته باشیم چطور select بزنیم که جواب 7 = اتومبيل/موتور/كاربراتور/ژيگلور/قطعه 1/قطعه 2/قطعه و جواب 3=اتومبيل/موتور/كاربراتور و جواب 1 اتومبيل در ستون نام درج شود ؟

زنده باشید

مرتضی تقدمی
پنج شنبه 20 آذر 1393, 11:01 صبح
آیا میشد فقط از یک select استفاده کرد ؟
اين اولين روشي بود كه به ذهنم رسيد. Select ها هم خيلي ساده هستند و نميدونم با روش ديگه اي هم ميشه نوشت يا نه.



دوم اینکه اگر در جدولی یک ستون کد کالا یا گروه های فرعی کالا داشته باشیم چطور select بزنیم که جواب 7 = اتومبيل/موتور/كاربراتور/ژيگلور/قطعه 1/قطعه 2/قطعه و جواب 3=اتومبيل/موتور/كاربراتور و جواب 1 اتومبيل در ستون نام درج شود ؟
يعني كدها در يك جدول و نام ها در يك جدول ديگه باشند؟ در اين صورت بايد به هر Select يك Join هم اضافه بشه.

موفق باشيد

mehdi.fni
پنج شنبه 20 آذر 1393, 19:40 عصر
بله منظورم در دو جدول است
کدها از جدول B و کدینگ در جدول A میباشد مثل نتیجه در جدول زیر


کد

مشخصات



7

اتومبيل/موتور/كاربراتور/ژيگلور/قطعه 1/قطعه 2/قطعه 3





1

اتومبيل





4

اتومبيل/موتور/كاربراتور/ژيگلور





.





حالا باید در دستور select بگیم هر سطر کالا از ابتدا از کدام گروها جاری شده

بازم تشکر میکنم

مرتضی تقدمی
پنج شنبه 20 آذر 1393, 21:35 عصر
با فرض جداول زیر:

tblNames


id fname
1 اتومبیل
2 موتور
3 کاربراتور
4 ژگلور
5 قعطه 1
6 قطعه 2
7 قطعه 3


tblCoding


id pid
1 0
2 1
3 2
4 3
5 4
6 5
7 6




create proc getName
@id int
as
declare @pid int = -1
declare @str nvarchar(1000) = ''
select top 1 @str = fname from tblNames N inner join tblCoding C on N.id = C.id where C.id = @id

while @pid <> 0
begin
select top 1 @pid = pid from tblCoding C inner join tblNames N on N.id = C.id where N.id = @id
select top 1 @str = fname + '/'+ @str from tblNames N inner join tblCoding C on N.id = C.id where C.id = @pid
set @id = @pid
end

select @str as a

mehdi.fni
جمعه 21 آذر 1393, 09:01 صبح
بازم تشکر ولی مثل اینکه نتونستم منظورم رو برسونم
مثال اول شما کاملا صحیح بود
مشکل من اینه که در یک جدول دیگر مثل موجوذی انبار ما تنها نیاز به نام کالا نداریم بلکه میخواهیم بدونیم از کدام گروه هم بوده است حالا باید در یک ستون کد کالا و ستون مقدار موجودی و ستون دیگر مشخصات کالا که برای مثال کد 7 مشخصات کالا اتومبيل/موتور/كاربراتور/ژيگلور/قطعه 1/قطعه 2/قطعه 3 و موجودی X میباشد حالا من چطور برای هر سطر از این جدول باید این proc را صدا کنم یا دستور select چطور صدا بزنم شاید باید یک تابع بسازم ورودی کد را به تابع بدم و نتیجه را در ستون نام بیارم حالا اگر بگید دستور select و function چطور باید باشد بمن کمک بزرگی کردید

موفق و پیروز باشید

مرتضی تقدمی
جمعه 21 آذر 1393, 13:51 عصر
دستور ایجاد Function:

alter function Fn_test(@id int)
returns varchar(50)
as
begin
-- دستورات
return 'name'
end

دستور استفاده از Function:

select dbo.fn_test(7) as Name

موفق باشید

mehdi.fni
جمعه 21 آذر 1393, 15:30 عصر
function اینجوری جواب میده

function [dbo].[Fn_test](@id int)
returns varchar(50)
as

begin
declare @pid int = -1
declare @str nvarchar(1000) = ''
select top 1 @str = ckalaname from ckalatree where id = @id
if @str <> null
begin
while @pid <> 0
begin
select top 1 @pid = pid from ckalatree where id = @id
select top 1 @str = ckalaname + '/'+ @str from ckalatree where id = @pid
set @id = @pid
end
end
return @str
end

حالا اگه یک Id داشته باشیم که معادل در فانکشن نداشته باشه چکار کنم که function تولوپ نباشه و مثلا کلمه (نامشخص) برگرده؟
بازم از اینکه کمکم میکنید سپاسگذارم

مرتضی تقدمی
شنبه 22 آذر 1393, 13:32 عصر
حالا اگه یک Id داشته باشیم که معادل در فانکشن نداشته باشه چکار کنم که function تولوپ نباشه و مثلا کلمه (نامشخص) برگرده؟
بازم از اینکه کمکم میکنید سپاسگذارم

می تونین این دستور رو به آخر فانکشن قبل از return کردن اضافه کنید:

set @str = ISNULL(@str, 'نامشخص')

mehdi.fni
یک شنبه 23 آذر 1393, 08:40 صبح
بله مشکل حل شد . با تشکر از زحمات شما