0

我有这样的存储过程:

ALTER procedure [dbo].[fetchkey]
@carid nvarchar(50) =null
as
begin
 select t.TBarcode,t.Status
from Transaction_tbl t 
 where t.TBarcode=@carid
end

我的输出:

TBarcode             Status
51891044554          1

我想再显示一列取决于我的状态。所以我写了一个这样的函数:

ALTER function [dbo].[keyloc](@status numeric(18,0)) RETURNS varchar(50)
as
begin
declare 
@keylocation  Varchar(50) 
if @status=1
select @keylocation= e1.Ename from Transaction_tbl t left join EmployeeMaster_tbl e1
ON e1.ECode = t.ECode AND t.Status = 1 or e1.Ecode=t.DelEcode and t.Status=4
return @keylocation
end

然后我尝试像这样执行我的存储过程:

ALTER procedure [dbo].[fetchkey]
@carid nvarchar(50) =null
as
begin
 select t.TBarcode,[dbo].[keyloc](t.Status)
from Transaction_tbl t 
 where t.TBarcode=@carid
end

但我的输出出错了:

TBarcode            
51891044554          Null

我的代码有什么问题?我的预期输出是这样的:

TBarcode             Status  key location
51891044554          1       Raheem.

我怎么能这样做?

4

2 回答 2

0

在您更改的过程中,您忘记 (?) 包含状态字段,这就是为什么不包含它。这个:

select t.TBarcode,[dbo].[keyloc](t.Status)

应该:

select t.TBarcode, t.Status, [dbo].[keyloc](t.Status) as 'Key location'

如果你也想要一个列Status和一个标题Key location

为什么你的函数返回 null 我真的不能说,数据是否正确?您是否尝试过单独执行它以查看它返回预期的输出?可能是函数中的 WHERE 子句以错误的方式计算。尝试通过将谓词放在括号中来使评估更明确,例如:

ON (e1.ECode = t.ECode AND t.Status = 1) or (e1.Ecode=t.DelEcode and t.Status=4)

如果这是它应该评估的方式。

此外,它Status真的是一个numeric(18,0)值,如果不是,您可能希望将函数参数更改为更合适的值(如 smallint 或 int)。

于 2013-07-24T10:22:11.683 回答
0

问题是你在你的函数中做了一个左连接,试试这个:

select @keylocation= e1.Ename 
from Transaction_tbl t
join EmployeeMaster_tbl e1
ON e1.ECode = t.ECode AND t.Status = 1 
or e1.Ecode=t.DelEcode and t.Status=4
于 2013-07-24T10:28:59.260 回答