Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:CTE WHILE循环正在为变量指定相同的值_Sql Server_Variables_While Loop_Common Table Expression - Fatal编程技术网

Sql server SQL Server:CTE WHILE循环正在为变量指定相同的值

Sql server SQL Server:CTE WHILE循环正在为变量指定相同的值,sql-server,variables,while-loop,common-table-expression,Sql Server,Variables,While Loop,Common Table Expression,我有一个名为prd0101的表,其中包含以下数据: codi descr nomfam nomsub nomgru marc codf peso estado fe_i -------------------------------------------------------------------------------------------

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

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
这是我选择数据并将其插入另一个名为product2的表中的查询:

DECLARE 
     @COUNTER INT = 0 ,
     @MAX INT = (SELECT COUNT(*)
                 FROM prd0101 p 
                 LEFT JOIN tbl01itm i ON p.codi = i.codi
                 LEFT JOIN tbl01grp g ON g.codgru = i.codgru
                 LEFT JOIN tbl01sbf s ON s.codsub = g.codsub
                 LEFT JOIN tbl01fam f ON f.codfam = s.codfam
                 WHERE p.fe_i >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)),
     @CODI NVARCHAR(100), 
     @DESCR NVARCHAR(100), 
     @NOMFAM NVARCHAR(100),
     @NOMSUB NVARCHAR(100), 
     @NOMGRU NVARCHAR(100), 
     @MARC NVARCHAR(100), 
     @CODF NVARCHAR(100),
     @PESO NVARCHAR(100), 
     @ESTADO NVARCHAR(100)


WHILE @COUNTER < @MAX
BEGIN
    --cte
    ;WITH cte AS
    (
        SELECT   
            p.codi, p.descr, f.nomfam, s.nomsub,
            g.nomgru, p.marc, p.codf, p.peso, p.estado, p.fe_i
        FROM 
            prd0101 p 
        LEFT JOIN
            tbl01itm i ON p.codi = i.codi
        LEFT JOIN
            tbl01grp g ON g.codgru = i.codgru
        LEFT JOIN
            tbl01sbf s ON s.codsub = g.codsub
        LEFT JOIN
            tbl01fam f ON f.codfam = s.codfam
    )
    SELECT 
        @CODI = cte.codi, @DESCR = cte.descr, 
        @NOMFAM = cte.nomfam, @NOMSUB = cte.nomsub, 
        @NOMGRU = cte.nomgru, @MARC = cte.marc, 
        @CODF = cte.codf, @PESO = cte.peso, @ESTADO = cte.estado
    FROM 
        cte
    WHERE 
        cte.fe_i >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
        AND cte.estado = 1

    IF NOT EXISTS (SELECT codi FROM Product2 WHERE codi = @CODI)
    BEGIN
        INSERT INTO Product2 (codi, "Description", Familia__c, Subfamilia__c, Grupo__c, Marca__c, ProductCode, Peso__c, IsActive)
        VALUES (@CODI, @DESCR, @NOMFAM, @NOMSUB, @NOMGRU, @MARC, @CODF, @PESO, @ESTADO)
    END

    SET @COUNTER = @COUNTER + 1
END
问题是当循环中它总是分配相同的记录时。codi=0301-011613的记录

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


我希望插入3条记录,但这只是插入最后一条记录。

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

您似乎希望在表Product2中插入当天的产品,而不考虑时间,但仅当estado=1时,并且仅当代码在表Product2中不存在时

如果是,并假设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 FIDLE引用被注释掉,因为没有提供数据;此外,我将GETDATE替换为“2019-06-27”,以匹配提供的数据:

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

您似乎希望在表Product2中插入当天的产品,而不考虑时间,但仅当estado=1时,并且仅当代码在表Product2中不存在时

如果是,并假设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 FIDLE引用被注释掉,因为没有提供数据;此外,我将GETDATE替换为“2019-06-27”,以匹配提供的数据:

我修复了它,将其添加到cte选择中:

ROW_NUMBER() OVER(ORDER BY p.codi) AS 'Row1'
在cte之外,在WHERE条款之后,我添加了以下内容:

AND Row1 = @COUNTER + 1

正如我所期望的那样迭代所有行。

我修复了它,将其添加到cte select:

ROW_NUMBER() OVER(ORDER BY p.codi) AS 'Row1'
在cte之外,在WHERE条款之后,我添加了以下内容:

AND Row1 = @COUNTER + 1
这会像我预期的那样迭代所有行