2013-08-02 1 views
-2

나중에 쿼리에서 호출 할 테이블을 작성하는 저장 프로 시저가 있습니다. CTE를 사용하는 새 테이블을 추가해야했지만 이제는이를 사용하여 테이블을 실행해야합니다. 표현을 끝내려면 오류가 발생합니다. ';'근처에 잘못된 구문이 있습니다. 내가 그것을 지울 때 나는 내가 가지고 있어야 할 잘못을 얻고있다. CTE와 쿼리 자체는 저장 프로 시저 외부에서 작동합니다. 어떤 도움은 insert 문은 CTE (with 표현)를 사용할 수 있습니다저장 프로 시저의 CTE가 작동하지 않습니다.

set @cdq = 'insert #REMOVAL_FLAG 
(
    MYKEY, 
    REMOVAL_FLAG 
) 

    WITH 
create_key AS(
     SELECT *, 
     (CONVERT(varchar(25), a.NDC11, 101) + CONVERT(varchar(25), a.PharmacyID, 101) + CONVERT(varchar(50),ABS(a.TotalNetCost),101)) as REVERSAL_KEY 

     FROM table1 a 

), 

find_rev AS (

     SELECT *, 
      CASE 
       WHEN MIN(TotalAmount) OVER (PARTITION BY REVERSAL_KEY) < 0 THEN 1 ELSE NULL 
      END as Flag 

     FROM create_key 

), 

primary_flag as (

     SELECT TOP 1500000 *, 
      DENSE_RANK() OVER (ORDER BY REVERSAL_KEY) as [GROUP], 
      ROW_NUMBER() OVER (PARTITION BY NDC11, PharmacyID, TotalNetCost ORDER BY REVERSAL_KEY) as PK 

     FROM find_rev 

     WHERE Flag = 1 

     ORDER BY [GROUP], PK 
), 

flagged as (
     SELECT *, 
      CASE 
       WHEN COUNT (PK) OVER (PARTITION BY [GROUP], PK) > 1 THEN ''REMOVE'' 
      END as REMOVAL_FLAG 

     FROM primary_flag 
) 

SELECT a1.MYKEY, f.REMOVAL_FLAG 

FROM table1 a1 
LEFT OUTER JOIN flagged f ON (f.MYKEY = a1.MYKEY) 


' 

답변

1

.... 감상 할 수있다.

WITH 
create_key AS(
     SELECT *, 
     (CONVERT(varchar(25), a.NDC11, 101) + CONVERT(varchar(25), a.PharmacyID, 101) + CONVERT(varchar(50),ABS(a.TotalNetCost),101)) as REVERSAL_KEY 

     FROM table1 a 

), 
find_rev AS (
     SELECT *, 
      CASE 
       WHEN MIN(TotalAmount) OVER (PARTITION BY REVERSAL_KEY) < 0 THEN 1 ELSE NULL 
      END as Flag 
     FROM create_key 
), 
primary_flag as (

     SELECT TOP 1500000 *, 
      DENSE_RANK() OVER (ORDER BY REVERSAL_KEY) as [GROUP], 
      ROW_NUMBER() OVER (PARTITION BY NDC11, PharmacyID, TotalNetCost ORDER BY REVERSAL_KEY) as PK 
     FROM find_rev 
     WHERE Flag = 1 
     ORDER BY [GROUP], PK 
), 
flagged as (
     SELECT *, 
      CASE 
       WHEN COUNT (PK) OVER (PARTITION BY [GROUP], PK) > 1 THEN ''REMOVE'' 
      END as REMOVAL_FLAG 
     FROM primary_flag 
) 
insert #REMOVAL_FLAG(MYKEY, REMOVAL_FLAG) 
    SELECT a1.MYKEY, f.REMOVAL_FLAG 
    FROM table1 a1 
    LEFT OUTER JOIN flagged f ON (f.MYKEY = a1.MYKEY) 
: SQL 서버에서는이 전에 insert하지 전에 select 간다