PDA

View Full Version : سوال: فراخوانی تابع



Z.Abdollahi
چهارشنبه 24 شهریور 1389, 13:21 عصر
من یک sp دارم بدین شرح


SELECT dbo.Aria_Customer.Customer_Id,dbo.Aria_Customer.Na me
,dbo.Aria_Customer.Family,dbo.Aria_Customer.Code,d bo.Aria_Customer.Tel
,dbo.Aria_Customer.Address,dbo.Aria_Customer.Mobil e
,dbo.Aria_Customer.CustomerkindId,dbo.Aria_Custome r.Reduction
,dbo.CardRequesters.OrderAmount,dbo.CardRequesters .OrderDate
,dbo.Aria_CardKind.Kind,dbo.Aria_CardKind.KindPric e,dbo.Aria_CardKind.CardKind_Id
from dbo.Aria_Customer
inner join dbo.CardRequesters on dbo.Aria_Customer.Customer_Id = dbo.CardRequesters.Customer_Id
inner join dbo.Aria_CardKind on dbo.CardRequesters.Card_Id = dbo.Aria_CardKind.CardKind_Id
where dbo.CardRequesters.Checked = 0 تا اینجای قضیه مشکلی نداریم. از اینجا به بعد بنده فیلدی داریم در جدول مشتری یا همون dbo.Aria_Customer به نام CustomerkindId این فیلد نوع مشتری رو مشخص می کنه. ما به دلایلی نمی تونیم جدولی داشته ابشیم تا این فیلد به صورت کلید خارجی از اون مقدار بگیره و مجبوریم مقدارش رو با case تولید کنیم. مشکل من اینه که دستور select case مربوطه رو در یک table valued function نوشته ام بدین شرح

alter FUNCTION CRM_CustomerKindSel
()
RETURNS TABLE
AS
RETURN
( select Customer_Kind=
case dbo.Aria_Customer.CustomerkindId
when '1' then 'مشتری عادی'
when '2' then 'نماینده فعلی'
when '3' then 'نماینده امانی'
when '4' then 'بازاریاب'
end
from dbo.Aria_Customer
)
GO
حالا نمی دونم از این تابع در sp بالا چطور استفاده کنم. اول اومدم همینطوری یه دستوری select دیگه به انتهای sp اضافه کردم که برای خودم هم بدیهی بود که جواب نمی ده! حالا از متخصصین گرامی خواهش می کنم راهی به من نشون بدن

بهزادصادقی
چهارشنبه 24 شهریور 1389, 14:17 عصر
اولا از اینکه با این دقت این همه اطلاعات دقیق را فراهم آورده اید بسیار تشکر می کنم. خیلی در حل مسئله کمک می کند. در آینده، اگر ساختار کل جداول استفاده شده در select ها را هم درج بفرمائید،خیلی کمک می توانند بکنند. من چون آن ساختار ها را ندارم، نمی تونم کد زیر را تست کنم.

شما دو راه اصلی دارید که می توانید از آن استفاده کنید. در این پست، راه اول را می آورم. در پست بعدی، راه حل دوم. شخصا دومی را به اولی ترجیح میدهم. دوباره، با عرض معذرت، به خاطر ندانشتن ساختار جداول شما، این راه حل ها را خودم در سیستم خودم تست نکرده ام.

راه حل اول:



if object_id( 'dbo.CRM_CustomerKindSel' ) is not null
drop function dbo.CRM_CustomerKindSel;
go

create FUNCTION CRM_CustomerKindSel
()
RETURNS TABLE
AS
RETURN
(
select '1' CustomerKindID, N'مشتری عادی' CustomerKind
union all
select '2', N'نماینده فعلی'
union all
select '3', N'نماینده امانی'
union all
select '4', N'بازاریاب'
)
GO

select ck.* from dbo.CRM_CustomerKindSel() ck -- test

SELECT
dbo.Aria_Customer.Customer_Id,
dbo.Aria_Customer.Name,
dbo.Aria_Customer.Family,
dbo.Aria_Customer.Code,
dbo.Aria_Customer.Tel,
dbo.Aria_Customer.Address,
dbo.Aria_Customer.Mobile,
dbo.Aria_Customer.CustomerkindId,
dbo.Aria_Customer.Reduction,
dbo.CardRequesters.OrderAmount,
dbo.CardRequesters.OrderDate,
dbo.Aria_CardKind.Kind,
dbo.Aria_CardKind.KindPrice,
dbo.Aria_CardKind.CardKind_Id,
ck.CustomerKind
from
dbo.Aria_Customer
inner join
dbo.CardRequesters
on
dbo.Aria_Customer.Customer_Id = dbo.CardRequesters.Customer_Id
inner join
dbo.Aria_CardKind
on
dbo.CardRequesters.Card_Id = dbo.Aria_CardKind.CardKind_Id
inner join
dbo.CRM_CustomerKindSel() ck
on
dbo.Aria_Customer.CustomerkindId = ck.CustomerKindID
where
dbo.CardRequesters.Checked = 0;

بهزادصادقی
چهارشنبه 24 شهریور 1389, 14:24 عصر
راه حل دوم:



if object_id( 'dbo.CRM_CustomerKindSel' ) is not null
drop function dbo.CRM_CustomerKindSel;
go

create FUNCTION dbo.CRM_CustomerKindSel
(
@customerKindID char(1)
)
RETURNS TABLE
AS
RETURN
( select CustomerKind =
case @customerKindID
when '1' then N'مشتری عادی'
when '2' then N'نماینده فعلی'
when '3' then N'نماینده امانی'
when '4' then N'بازاریاب'
else null
end
);

GO

select ck.* from dbo.CRM_CustomerKindSel('1') ck -- test
select ck.* from dbo.CRM_CustomerKindSel('2') ck -- test
select ck.* from dbo.CRM_CustomerKindSel('3') ck -- test
select ck.* from dbo.CRM_CustomerKindSel('4') ck -- test
select ck.* from dbo.CRM_CustomerKindSel('X') ck -- test

SELECT
dbo.Aria_Customer.Customer_Id,
dbo.Aria_Customer.Name,
dbo.Aria_Customer.Family,
dbo.Aria_Customer.Code,
dbo.Aria_Customer.Tel,
dbo.Aria_Customer.Address,
dbo.Aria_Customer.Mobile,
dbo.Aria_Customer.CustomerkindId,
dbo.Aria_Customer.Reduction,
dbo.CardRequesters.OrderAmount,
dbo.CardRequesters.OrderDate,
dbo.Aria_CardKind.Kind,
dbo.Aria_CardKind.KindPrice,
dbo.Aria_CardKind.CardKind_Id,
ck.CustomerKind
from
dbo.Aria_Customer
inner join
dbo.CardRequesters
on
dbo.Aria_Customer.Customer_Id = dbo.CardRequesters.Customer_Id
inner join
dbo.Aria_CardKind
on
dbo.CardRequesters.Card_Id = dbo.Aria_CardKind.CardKind_Id
inner join
dbo.CRM_CustomerKindSel( dbo.Aria_Customer.CustomerkindId ) ck
on
dbo.Aria_Customer.CustomerkindId = ck.CustomerKindID
where
dbo.CardRequesters.Checked = 0;

Z.Abdollahi
پنج شنبه 25 شهریور 1389, 08:54 صبح
جناب صادقی با تشکر از توجه شما. این ساختار جدول ها:
جدول Customer

[code] CREATE TABLE [dbo].[Aria_Customer](
[Customer_Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Family] [nvarchar](50) NULL,
[int] NULL,
[Tel] [nvarchar](40) NULL,
[Mobile] [nvarchar](50) NULL,
[Address] [nvarchar](1000) NULL,
[email] [nvarchar](50) NULL,
[CustomerkindId] [int] NULL,
) ON [PRIMARY]جدول CardRequesters


CREATE TABLE [dbo].[CardRequesters](
[CardRequestId] [int] IDENTITY(1,1) NOT NULL,
[Customer_Id] [int] NOT NULL,
[Card_Id] [int] NOT NULL,
[OrderAmount] [int] NULL,
[OrderDate] [nvarchar](10) NULL,
[OrderTime] [nvarchar](10) NULL,
[Checked] [bit] NULL,
CONSTRAINT [PK_CardRequesters_1] PRIMARY KEY CLUSTERED
(
[CardRequestId] ASC
)
جدول CardKind

CREATE TABLE [dbo].[Aria_CardKind](
[CardKind_Id] [int] IDENTITY(1,1) NOT NULL,
[Type] [nvarchar](10) NULL,
[Kind] [nvarchar](1000) NULL,
[KindPrice] [int] NULL,
[Deleted] [bit] NULL,
CONSTRAINT [PK_CardKind] PRIMARY KEY CLUSTERED
(
[CardKind_Id] ASC
)در ضمن من از این راه حلی که زحمت کشیدید و ارائه دادید زیاد سر در نیاوردم اگر همه اش رو یکجا باید در یک Sp بگذارم که خطا داره اگر راه دیگه ای داره که لطفا بهم بگید. بازم از وقتی که می گذارید ممنون

بهزادصادقی
جمعه 26 شهریور 1389, 02:12 صبح
از درج ساختار جداول تشکر می کنم.

به چه خطایی بر خوردید؟ لطفا متن دقیق خطا را اینجا درج کنید. آیا هر دو اسکریپت این خطا را می دهند، یا هر کدام یک خطای جداگانه؟

behrouzlo
شنبه 27 شهریور 1389, 11:17 صبح
من دستور را اجرا نکردم ولی فکر کنم وقتی که یک جدول و تابع را با هم Join می کنم و به تابع فیلدی را از جدول به عنوان پارامتر ورودی ارسال می کنیم باید به جای Inner join از Cross Apply استفاده کنیم.