2013-04-24 174 views
2

我有一个返回DISTINCT ID的CTE。我想对每个返回的Id执行一个标量函数。如何对SQL Server CTE的结果执行存储过程

WITH cte (reqID) as 

(SELECT DISTINCT pol.ReqID FROM 
LOG_PackingListItems pli 
JOIN 
v_PO_LN    pol on pol.PO_ID = pli.PoId 
WHERE 
pli.PackingListHeaderID = 1) 


EXEC dbo.spUpdateLOG_ReqCompleteCheck reqID -- Error "Incorrect Syntax near EXEC" 

EXEC行是我想做的工作,但我得到一个语法错误。不知道我想要做什么是可能的,或者如果我确实有语法错误。有任何想法吗?

编辑: 我,因为我现在用的是表值参数所建议增加对存储过程的代码realnumber3012

编辑: 我已经改变了我的CTE代码,以便它根据实际编号建议填充表格类型。执行spUpdateLOG_ReqCompleteCheck时,我现在遇到错误“子查询返回多个值。”

DECLARE @ReqIdTVP as ReqIdType; 
DELETE FROM @ReqIDTVP; 
with cte (reqID) as 
(select distinct pol.ReqID from 
LOG_PackingListItems pli 
join 
v_PO_LN pol on pol.PO_ID = pli.PoId 
where 
    pli.PackingListHeaderID = @PackingListHeaderID) 

INSERT INTO @ReqIdTVP 
SELECT * FROM cte 

EXEC dbo.spUpdateLOG_ReqCompleteCheck @ReqIdTVP 

存储过程的代码:

Alter PROCEDURE spUpdateLOG_ReqCompleteCheck 

(@ReqIdTVP ReqIdType READONLY) 

AS 
BEGIN 

DECLARE @TotalOrd int 
DECLARE @TotalRx int 
DECLARE @ReqID char(8) 

SET @ReqID = (SELECT ReqID FROM @ReqIdTVP) 

SET @TotalOrd = (SELECT ISNULL(SUM(ORD_QTY),0) 
      FROM  dbo.v_PoLnNonFreight l 
      WHERE l.ReqID = @reqID) 


SET @TotalRx = (SELECT ISNULL(SUM(TotalRxSite),0) 
      FROM  dbo.v_PoLnNonFreight l 
      WHERE l.ReqID = @reqID) 


IF @TotalRx >= @TotalOrd 
BEGIN 
    DECLARE @curDate datetime 
    SET @CurDate = ISNULL(@CurDate,GetDate()) 
SET NOCOUNT ON; 

    UPDATE LOG_ReqHeader 
    SET 
ReqCompleteDate = @curDate, 
ReqStatus = 'Complete' 

    WHERE ReqID = @ReqID 
END 
END 
+0

版本的SQL SERVER? – realnumber3012 2013-04-25 04:10:46

+0

对不起,没有想过需要提供,2008 R2 – 2013-04-25 15:39:34

+0

你可以改变标题吗?这非常具有误导性。您不会针对您尝试调用每个行的存储过程的结果发出标量函数。这是一个巨大的差异。如果您想要应用标量函数,那么您将使用CROSS APPLY运算符...... – 2013-04-25 21:45:54

回答

0

看来你的存储过程做的唯一一件事就是更新记录表:(它只能通过这个语句改变状态和不返回任何东西? ???

UPDATE LOG_ReqHeader 
    SET 
ReqCompleteDate = @curDate, 
ReqStatus = 'Complete' 

    WHERE ReqID = @ReqID 

如何进行拆分逻辑和写一个函数(内联如果可能的话,将评估你正在寻找的条件(并没有真正理解你在那里做什么) - 使用CROSS APPLY OPERATOR对CTE的结果运行函数(如果你愿意,将它包装在另一个CTE中)。

你会最终有一个结果集,看起来像[REQID],[UpdateLog](其中updateLog是BIT)

后来干脆一套基于upadete接合到的结果:

UPDATE l SET 
    ReqCompleteDate = @curDate, 
    ReqStatus = 'Complete' 
FROM 
    LOG_ReqHeader AS l 
    JOIN <CTE> AS c ON c.[ReqID] = l.[ReqID] 
WHERE 
    c.[UpdateLog] = 0x1 

这是否有意义?

+0

我有一个请购单应用程序(Logisitics部门的一部分,因此是ReqHeader表的LOG_序言)。我有一个触发器,当申请行项目被标记为装箱清单的一部分时收货(可能只有部分申请收据)。 CTE返回我需要评估的ReqID,以查看是否应在包装清单中的每个请购单收到所有已订购物料后,是否应更新LOG_ReqHeader表的完整日期。 spUpdateLOG_ReqCompleteCheck需要循环遍历ReqID,但这是我得到的子查询返回多个值。希望这是明确的。 – 2013-04-25 22:13:39

相关问题