Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加case语句时,存储过程中出现错误_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 添加case语句时,存储过程中出现错误

Sql 添加case语句时,存储过程中出现错误,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个类似这样的程序: SELECT k.HBarcode, m.make,t.Compl, t.plateno,t.self,t.dtime, v.vtype, l.locname,[dbo].[EDTCAL](t.TBarcode)as EDT, t.locid,t.vtid,t.lsttic, c.Colname, te.UniqueName FROM transaction_tbl t left JOIN KHanger_tbl k ON t

我有一个类似这样的程序:

SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,[dbo].[EDTCAL](t.TBarcode)as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
ALTER function [dbo].[EDTCAL](@cardID VARCHAR(50)) RETURNS int
as 
begin
declare
@locid int,
@EDT int,
@minEDT int,
@buffEDT int,
@value int

select @locid= t.Locid from Transaction_tbl t where t.TBarcode=@cardID
select @EDT= l.EDT from Location_tbl l where l.Locid=@locid
select @minEDT=l.MinEDT  from Location_tbl l where l.Locid=@locid
select @buffEDT=l.BuffrEDT  from Location_tbl l where l.Locid=@locid 
if (@EDT is null) or (@EDT=0)
begin
select @value=@minEDT+@buffEDT
end 
else
begin
select @value=@EDT+@buffEDT
end
return @value
end
SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt +l.bufferEdt else l.edt + l.bufferEdt end as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
我的功能如下:

SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,[dbo].[EDTCAL](t.TBarcode)as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
ALTER function [dbo].[EDTCAL](@cardID VARCHAR(50)) RETURNS int
as 
begin
declare
@locid int,
@EDT int,
@minEDT int,
@buffEDT int,
@value int

select @locid= t.Locid from Transaction_tbl t where t.TBarcode=@cardID
select @EDT= l.EDT from Location_tbl l where l.Locid=@locid
select @minEDT=l.MinEDT  from Location_tbl l where l.Locid=@locid
select @buffEDT=l.BuffrEDT  from Location_tbl l where l.Locid=@locid 
if (@EDT is null) or (@EDT=0)
begin
select @value=@minEDT+@buffEDT
end 
else
begin
select @value=@EDT+@buffEDT
end
return @value
end
SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt +l.bufferEdt else l.edt + l.bufferEdt end as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
所以我的存储过程执行时间很慢..所以我从过程中删除了我的函数,并编写了如下代码:

SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,[dbo].[EDTCAL](t.TBarcode)as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
ALTER function [dbo].[EDTCAL](@cardID VARCHAR(50)) RETURNS int
as 
begin
declare
@locid int,
@EDT int,
@minEDT int,
@buffEDT int,
@value int

select @locid= t.Locid from Transaction_tbl t where t.TBarcode=@cardID
select @EDT= l.EDT from Location_tbl l where l.Locid=@locid
select @minEDT=l.MinEDT  from Location_tbl l where l.Locid=@locid
select @buffEDT=l.BuffrEDT  from Location_tbl l where l.Locid=@locid 
if (@EDT is null) or (@EDT=0)
begin
select @value=@minEDT+@buffEDT
end 
else
begin
select @value=@EDT+@buffEDT
end
return @value
end
SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt +l.bufferEdt else l.edt + l.bufferEdt end as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName

  FROM transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 

  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = '0213'
*但是得到错误: 味精207,16级,状态1,第4行 无效的列名“bufferEdt”。 味精207,16级,状态1,第4行 无效的列名“bufferEdt”

我只添加了额外的代码


当l.edt为null或l.edt=0时,则l.minEdt+l.bufferEdt否则l.edt+l.bufferEdt结束为edt

执行计划中tbarcode='0213'出现在何处?它应该在那里的某个地方。使用它可能没有什么好处。一般来说,如果您想提高查询的执行时间,可以完全去掉udf,并从基于联接的case语句中获取@minEDT+@buffEDT和@value=@EDT+@buffEDT

抱歉在电话里这么做。关键是你不需要一个单独的函数。将对udf的调用替换为以下内容: 当l.edt为null或l.edt=0时,则l.minEdt+l.bufferEdt否则l.edt+l.bufferEdt结束为edt


关键是您的udf会对返回的每一行进行单独的选择,从而增加执行时间。您不需要它,因为字段已作为select语句的一部分返回。

sir如何将我的函数连接到特定的存储过程?在select语句中,当l.edt为null或l.edt=0时,不调用EDTCAL,然后l.minEdt+l.bufferEdt,否则l.edt+l.bufferEdt结束为edt。正如我说的,我在电话里这么做。稍后我将发布代码,但请尝试此操作。因此,添加此代码后,我不想返回任何值case语句应生成与您的返回值等效的值,因此您根本不需要函数。先生,我已将您的代码添加到存储过程中..但出现错误..我更新了我的qstation