Sql server SQL Server:CTE WHILE循环正在为变量指定相同的值
我有一个名为prd0101的表,其中包含以下数据: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 -------------------------------------------------------------------------------------------
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
这会像我预期的那样迭代所有行