我有一个名为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条记录,但仅插入最后一条。
答案 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
按照我的预期迭代所有行。