在 SQL Server 2008 中领先

LEAD in SQL Server 2008

我已经完成了一个包含 LEAD 的存储过程,不幸的是脚本必须 运行 在 2008 年,所以有人知道如何在 2008 年实现这个吗?

INSERT INTO #ARTICLES(EAN, ID_ART, QTE, PV_NET_HT)
SELECT EAN, ID_ART, QTE_CDE, PA_NET
FROM (
    SELECT TEXTE_LIG,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN ID_ART ELSE LEAD(ID_ART) OVER (ORDER BY (SELECT NULL)) END AS ID_ART,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN CHAR01 ELSE LEAD(CHAR01) OVER (ORDER BY (SELECT NULL)) END AS EAN,
            LEAD(QTE_CDE, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 1 ELSE 2 END) OVER (ORDER BY (SELECT NULL)) AS QTE_CDE,
            LEAD(PX_BASE, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 2 ELSE 3 END, NULL) OVER (ORDER BY (SELECT NULL)) AS PX_BASE,
            LEAD(PX_NET, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 2 ELSE 3 END, NULL) OVER (ORDER BY (SELECT NULL)) AS PA_NET
    FROM AMAZON_ACHATS_LIG 
    WHERE ID_ACHATS_ENT = @IDENTITY
) AS LIGNE
WHERE TEXTE_LIG LIKE 'LIN%';

要在 2008 年替换 LEAD,您需要对同一个 table 进行自连接,到下一行。为此,最简单的方法是拥有某种连续的 ID,您可以使用 ID + 1 加入记录。如果不存在 suitable 连续 ID,则 select 您在 CTE 中的数据,并向其添加 row_number。然后在外部查询中使用 row_number 进行自连接。

顺便说一句,请注意没有 "keeping the database order" 这样的东西。如果您没有为给定的查询指定顺序,那么 SQL 将决定输出顺序,它可能与输入的顺序相同,也可能完全不同,或者可能几乎相同,除了一些记录。它可能 return 在不同的场合对同一个查询执行完全不同的命令,这取决于它这次决定使用哪个查询计划。如果您希望数据保持与输入时相同的顺序,则需要有一个 auto-incrementing 标识列以确保这是可能的,否则有一天您将得不到预期的结果。

在您的查询中,您的各种潜在客户的偏移量为 none(与 1 相同)、1、2 和 3,因此您需要自行加入 3 次才能涵盖所有这些选项。在您的查询中,您随后将每个 LEAD 替换为来自正确 self-joined table 的数据。你想要这样的东西:

WITH BASEDATA AS (
    --THIS IS YOUR BASIC DATA, WITH A ROW NUMBER ADDED
    -- DO THIS AS A CTE, SO YOU CAN JOIN TO IT MULTIPLE TIMES
    SELECT TEXTE_LIG, ID_ART, CHAR01, QTE_CDE, PX_BASE, PX_NET, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNo
    FROM AMAZON_ACHATS_LIG 
    WHERE ID_ACHATS_ENT = @IDENTITY
)
INSERT INTO #ARTICLES(EAN, ID_ART, QTE, PV_NET_HT)
SELECT EAN, ID_ART, QTE_CDE, PA_NET
FROM (
    SELECT TEXTE_LIG,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN ID_ART ELSE B1.ID_ART END AS ID_ART,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN CHAR01 ELSE B1.CHAR01 END AS EAN,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN B1.QTE_CDE ELSE B2.QTE_CDE END AS QTE_CDE,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN B2.PX_BASE ELSE B3.PX_BASE END AS PX_BASE,
            CASE WHEN TEXTE_LIG LIKE '%++%' THEN B2.PX_NET ELSE B3.PX_NET END AS PA_NET
    FROM BASEDATA B0  --THE BASIC DATA
        LEFT OUTER JOIN BASEDATA B1 ON B1.RowNo = B0.RowNo + 1  --This is your LEAD (1) table
        LEFT OUTER JOIN BASEDATA B2 ON B2.RowNo = B0.RowNo + 2  --This is your LEAD (2) table
        LEFT OUTER JOIN BASEDATA B3 ON B3.RowNo = B0.RowNo + 3  --This is your LEAD (3) table
    --WHERE ID_ACHATS_ENT = @IDENTITY  --DON'T NEED THIS AMY MORE, DONE IN CTE
) AS LIGNE
WHERE TEXTE_LIG LIKE 'LIN%';