【问题标题】:CTE in stored procedure not working存储过程中的 CTE 不起作用
【发布时间】:2013-08-02 18:47:21
【问题描述】:

我有一个存储过程正在构建表以便稍后在查询中调用。我不得不添加使用 CTE 的新表,但现在当我使用 ; 运行它时要结束表达式,我收到错误 Incorrect syntax near ';'当我删除它时,我得到了我需要的错误;与 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)


'

【问题讨论】:

    标签: sql stored-procedures common-table-expression


    【解决方案1】:

    insert 语句可以使用 CTE(with 表达式)。在 SQL Server 中,它位于insert 之前,而不是select 之前:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2011-02-20
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多