PDA

View Full Version : خطا در Conditional SQL



solaleh
پنج شنبه 22 مرداد 1388, 13:05 عصر
سلام دوستان
من storedprocedure ای دارم که مجبورم در قسمت پارامترهای select برای آن شرط بذارم.storedprocedure به صورت زیر است:


PROCEDURE sp_TarazeKol

@kolcd1 nvarchar(50),
@kolcd2 nvarchar(50),
@docnum1 nvarchar(50),
@docnum2 nvarchar(50),
@docdate1 nvarchar(13),
@docdate2 nvarchar(13)

AS
Declare @sql nvarchar(4000),@paramlist nvarchar(4000)
SELECT @sql=
"select Document.KolCode,KolName,sum(Debtor) as 'DebtCircle',sum(Creditor) as 'CredCircle'"
if sum(Debtor)>sum(Creditor)
begin
SELECT @sql=@sql+",sum(Debtor)-sum(Creditor) as 'Remain'
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName"
end
if sum(Creditor)>sum(Debtor)
begin
SELECT @sql=@sql+",sum(Creditor)-sum(Debtor) as 'Remain'
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName"
end

Exec(@sql)



اما موقع ذخیره خطایی می ده که ضمیمه اش کردم.
اشکال کجاست؟
ممنون از توجهتون.

محمد سلیم آبادی
پنج شنبه 22 مرداد 1388, 14:08 عصر
خطوطی که به صورت comment در آمدند مشکل syntax ندارند بلکه مشکل منطقی دارند.





CREATE PROCEDURE sp_TarazeKol

@kolcd1 nvarchar(50),
@kolcd2 nvarchar(50),
@docnum1 nvarchar(50),
@docnum2 nvarchar(50),
@docdate1 nvarchar(13),
@docdate2 nvarchar(13)

AS
Declare @sql nvarchar(4000),@paramlist nvarchar(4000)
SELECT @sql=
'select Document.KolCode,KolName,sum(Debtor) as [DebtCircle],sum(Creditor) as [CredCircle]'
-- if sum(Debtor)>sum(Creditor)
begin
SELECT @sql=@sql+',sum(Debtor)-sum(Creditor) as [Remain]
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName'
end
-- if sum(Creditor)>sum(Debtor)
begin
SELECT @sql=@sql+',sum(Creditor)-sum(Debtor) as [Remain]
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName'
end


-- Exec(@sql)

solaleh
پنج شنبه 22 مرداد 1388, 14:25 عصر
ممنون.اون خطا برطرف شد. حالا ستون های Debtor و Creditor را نمی شناسه. لطفا راهنمایی کنید.

محمد سلیم آبادی
پنج شنبه 22 مرداد 1388, 14:32 عصر
باید مشخص کنید که این ستون ها باید از چه source ای یعنی چه جداولی ایجاد شوند.

باید دو متغیر تعریف کنید و با مقادیر ستون های مورد نظر مقدار دهید کنید.

محمد سلیم آبادی
پنج شنبه 22 مرداد 1388, 14:37 عصر
CREATE PROCEDURE sp_TarazeKol

@kolcd1 nvarchar(50),
@kolcd2 nvarchar(50),
@docnum1 nvarchar(50),
@docnum2 nvarchar(50),
@docdate1 nvarchar(13),
@docdate2 nvarchar(13),
@sql nvarchar(2000) output
AS
Declare @paramlist nvarchar(4000)
Declare @Debtor int, @Creditor int
SELECT @sql=
'select Document.KolCode,KolName,sum(Debtor) as [DebtCircle],sum(Creditor) as [CredCircle]'
select @Debtor=sum(Deptor), @Creditor=sum(Creditor)
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName
if @Debtor>@Creditor
begin
SELECT @sql=@sql+',sum(Debtor)-sum(Creditor) as [Remain]
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName'
end
if @Debtor<@Creditor
begin
SELECT @sql=@sql+',sum(Creditor)-sum(Debtor) as [Remain]
from Document inner join Kol on Document.KolCode=Kol.KolCode
where Document.KolCode between @kolcd1 and @kolcd2
and DocNum between @docnum1 and @docnum2
and DocDate between @docdate1 and @docdate2
group by Document.KolCode,KolName'
end

Go

declare @sql nvarchar(50)
exec sp_TarazeKol '','','','','','',
@sql output
Exec(@sql)

محمد سلیم آبادی
پنج شنبه 22 مرداد 1388, 18:33 عصر
یکمی بیشتر به SP شما نگاه کردم و به هدف این SP پی بردم.
یک راه ساده تر برای رسیدن به خواسته ی خود استفاده از تابع Abs است.
البته SP پست شماره 5 کاملا صحیح می باشد.

به مثال زیر توجه کنید.


Select Abs(15-20)
Select Abs(20-15)





نتیجه هر دو دستور فوق عدد 5 خواهد بود.