2

DISTINCT ID を返す CTE があります。返された ID ごとにスカラー関数を実行したいと考えています。

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 コードを変更したので、実数が示唆するように Table-Type が設定されます。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

Sproc コード :

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
4

1 に答える 1

0

ストアド プロシージャが行う唯一のことは、ログ テーブルを更新することのようです (このステートメントを介して状態を変更するだけで、何も返されません????

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

  WHERE ReqID = @ReqID 

ロジックを分割して、探している条件を評価する関数 (可能であればインライン) を作成するのはどうですか? CROSS APPLY OPERATOR を使用して、必要に応じて別の CTE を作成します。

[ReqId]、[UpdateLog] (updateLog はビット) のような結果セットになります。

次に、結果に対して set ベースの upadete JOINING を実行します。

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

これは意味がありますか?

于 2013-04-25T21:52:13.897 に答える