SQL Server:CTE WHILE LOOP将相同的值分配给变量

时间:2019-06-28 02:02:05

标签: sql-server variables while-loop common-table-expression

我有一个名为prd0101的表,其中包含以下数据:

heydanhey

这是我的查询,用于选择数据并将其插入另一个名为product2的表中:

codi        descr               nomfam                  nomsub          nomgru      marc    codf                peso    estado  fe_i
---------------------------------------------------------------------------------------------------------------------------------------------------------
0301-011611 TIRAS DE PRUEBA     PRODUCTOS TERMINADOS    ALIGERADOS      ALIGERADOS  ND      123456789ABCDEF     0.0250  1       2019-06-27 00:00:00.000
0301-011612 TIRAS PRUEBAS 2     PRODUCTOS TERMINADOS    ALIGERADOS      ALIGERADOS  ND      123456789ABCDE1     0.0360  1       2019-06-27 00:00:00.000
0301-011613 TIRAS PRUEBA 3      PRODUCTOS TERMINADOS    ALIGERADOS      ALIGERADOS  ND      123456789ABCDEF2    0.0690  1       2019-06-27 00:00:00.000

问题是,在循环中总是分配相同的记录。 codi = 0301-011613的记录

我在循环内打印了一些变量,它为其中的3个打印了相同的最后一行。

我希望插入3条记录,但仅插入最后一条。

2 个答案:

答案 0 :(得分:0)

原始TSQL(带有CTE)似乎为每个循环返回相同的值(结果集中的最后一条记录?)。也就是说,标量变量@COUNTER递增直到超过@MAX,但CTE / SELECT语句似乎并没有改变它返回的内容。

您似乎希望将当天的产品(无论时间如何)插入表Product2中,但是仅当estado = 1且表Code2中尚未存在该代码时。

如果是这样,并假设codi包含唯一值,则可以通过INSERT语句执行此操作:

INSERT Product2(codi
                ,Description
                ,Familia__c
                ,Subfamilia__c
                ,Grupo__c
                ,Marca__c
                ,ProductCode
                ,Peso__c
                ,IsActive
               )

SELECT      p.codi
            ,p.descr
            ,f.nomfam
            ,s.nomsub
            ,g.nomgru
            ,p.marc
            ,p.codf
            ,p.peso
            ,p.estado

  FROM      prd0101 AS p

            LEFT JOIN tbl01itm AS i 
            ON p.codi=i.codi

            LEFT JOIN tbl01grp AS g 
            ON g.codgru=i.codgru

            LEFT JOIN tbl01sbf AS s 
            ON s.codsub=g.codsub

            LEFT JOIN tbl01fam AS f 
            ON f.codfam=s.codfam

 WHERE      -- Note: Select all rows from current day, regardless of time:
            p.fe_i >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0)
   AND      p.estado = 1
   AND      NOT EXISTS 
            (SELECT P2.codi 
               FROM Product2 AS P2
              WHERE p2.codi = p.codi
            )
;


SELECT      *

  FROM      Product2
;

输出显示三行,如预期的那样:

|        codi |     Description | Familia__c | Subfamilia__c | Grupo__c | Marca__c |      ProductCode | Peso__c | IsActive |
|-------------|-----------------|------------|---------------|----------|----------|------------------|---------|----------|
| 0301-011611 | TIRAS DE PRUEBA |          1 |             1 |        1 |       ND |  123456789ABCDEF |       0 |        1 |
| 0301-011612 | TIRAS PRUEBAS 2 |          1 |             1 |        1 |       ND |  123456789ABCDE1 |       0 |        1 |
| 0301-011613 |  TIRAS PRUEBA 3 |          1 |             1 |        1 |       ND | 123456789ABCDEF2 |       0 |        1 |

SQL Fiddle(未提供对其他表的引用,因为未提供数据;此外,我将GETDATE()替换为日期“ 2019-06-27”,以匹配提供的数据): http://sqlfiddle.com/#!18/5ba09/18

答案 1 :(得分:0)

我修复了此问题,并将其添加到cte select中:

ROW_NUMBER() OVER(ORDER BY p.codi) AS 'Row1'

在WHERE子句之后的cte之外,我添加了以下内容:

AND Row1 = @COUNTER + 1

按照我的预期迭代所有行。