【问题标题】:SQL Server 2008 - WHILE LoopSQL Server 2008 - WHILE 循环
【发布时间】:2018-10-28 07:15:21
【问题描述】:

我有一个我无法解决的问题,我的最终目标是制作一个每次插入“factura”表时都会运行的触发器,然后填充一个只有一个字段(varchar max)的中间表,因为?,因为我有一个 Java 组件,它读取这个字段并生成一个他后来使用的 file.txt,但是我有一个我无法解决的问题,我看到了一个光标或者更好的是while循环但我很纠结,我使用的BD管理器是SQL Server 2008,我用来生成数据的select查询将填充到触发器中的中间表中,由两部分组成,表头和细节,我试图做的是每个标题只显示一行,但由于在某些情况下有超过 1 个细节,它会显示重复的行。

这是我的查询:

select 
    --HEADER(CB),
    'CB' + '|' + CONVERT(varchar(10),(CONVERT(DATE, f.FECHA))) + '|' +
       '20601140897' + '|' + '03' + '|' +
       SUBSTRING(f.SERIE, 1, 2) + '0' + SUBSTRING(f.SERIE, 3, 2) + '-' + 
       REPLACE(STR(f.NUMERO, 8), SPACE(1), '0') + '|' + 
       CASE 
          WHEN f.CODIGO = '' THEN '99999999' 
          ELSE f.CODIGO 
       END + '|' + '0' + '|' +
       CASE 
          WHEN f.NOMBRE =''  THEN 'Clientes varios' 
          ELSE f.NOMBRE  
       END + '|PEN|' +
       CONVERT(varchar(13), (CAST(f.SUBTOTAL AS decimal(10, 2)))) + 
       '|0.00|0.00|' +
       CONVERT(varchar(13), (CAST(f.IMPUESTO AS decimal(10, 2)))) + 
       '|0.00|0.00|0.00|0.00|' +
       CONVERT(varchar(13), (cast(f.TOTAL as  decimal(10, 2)))) + '|0.00|0.00|' +
       'MONTO TOTAL' + '|||||||1000||||0.00|0.00|0.00||' + CHAR(13) + CHAR(10) +
  --DETAIL(DF)
  'DB' + '|' + 'NUMBER OF ROW' + '|' + d.PRODUCTO + '|' + 'NIU' + '|' + '1' + '|' +
     d.DESCRIPCIO + '|' + CONVERT(varchar(13),(ROUND((d.PRECIO/1.18), 2))) + '|' +
     CONVERT(varchar(13), (cast(d.PRECIO as decimal(10, 2)))) + '|' +
     CONVERT(varchar(13), (ROUND(((d.PRECIO/1.18) * 0.18), 2))) + '|10|0.00||' +
     CONVERT(varchar(13), (cast(d.TOTAL as decimal(10, 2)))) + '|0.00||0.00||'
FROM
    factura f 
FULL JOIN
    detalle d ON f.NUMERO = d.NUMERO 
FULL JOIN
    clientes c ON f.CODIGO = c.codigo

这就是它所显示的:

CB|2017-10-08|20601140897|03|B001-00002224|000700323|0|客户 varios|PEN|25.42|0.00|0.00|4.58|0.00|0.00|0.00|0.00|30.00|0.00|0.00|MONTO 总计|||||||1000||||0.00|0.00|0.00|| 数据库|NUMBER OF 行|220|牛|1|待办事项 直径|8.47|10.00|1.53|10|0.00||10.00|0.00||0.00||

CB|2017-10-08|20601140897|03|B001-00002224|000700323|0|客户 varios|PEN|25.42|0.00|0.00|4.58|0.00|0.00|0.00|0.00|30.00|0.00|0.00|MONTO 总计|||||||1000||||0.00|0.00|0.00|| 数据库|NUMBER OF ROW|230|NIU|1|10 分钟 FIN DE SEMANA|16.94|20.00|3.06|10|0.00||20.00|0.00||0.00||

我在寻找什么:

CB|2017-10-08|20601140897|03|B001-00002224|000700323|0|客户 varios|PEN|25.42|0.00|0.00|4.58|0.00|0.00|0.00|0.00|30.00|0.00|0.00|MONTO 总计|||||||1000||||0.00|0.00|0.00|| 数据库|NUMBER OF 行|220|牛|1|待办事项 直径|8.47|10.00|1.53|10|0.00||10.00|0.00||0.00|| 数据库|NUMBER OF ROW|230|NIU|1|10 分钟 FIN DE SEMANA|16.94|0.00|3.06|10|0.00||20.00|0.00||0.00||

有人可以帮助我吗?或者给我一个能够实现它的结构,我将非常感激。

【问题讨论】:

  • 你能分享一下factura、detalle、clientes和sample records的表结构吗?
  • 我将一个链接传递给我刚刚对那 3 个表制作的备份,数据库没有主键,因为我必须这样做,但我希望你能帮助我。 mega.nz/#!9WREjLDJ!jPFU_aH-i77DBcxNr9fZ6r9HWZL08uyuiPN5WjWQBbA
  • 感谢 Dalex!此备份会有所帮助。
  • 我的回答有帮助吗?如果是,请选择作为答案。
  • 非常感谢您的解决方案,对于性能问题,真的只需要最后一条记录,因为它将是填充中间表的触发器,我不需要列出所有连接的记录,所以 xml 路径将为我服务,STRING_AGG 在 sql server 2008 中不可用,这很痛苦。

标签: sql-server sql-server-2008 while-loop triggers cursor


【解决方案1】:

这是查询,当有相同的标头数据时,它将附加详细数据。查询很慢,因为它涉及到字符串和大列的 JOIN,您可以将 CTE 替换为临时表,通过添加索引可能会提供更好的性能。

;WITH CTE AS (
select 
    --HEADER(CB),
    'CB' + '|' + CONVERT(varchar(10),(CONVERT(DATE, f.FECHA))) + '|' +
       '20601140897' + '|' + '03' + '|' +
       SUBSTRING(f.SERIE, 1, 2) + '0' + SUBSTRING(f.SERIE, 3, 2) + '-' + 
       REPLACE(STR(f.NUMERO, 8), SPACE(1), '0') + '|' + 
       CASE 
          WHEN f.CODIGO = '' THEN '99999999' 
          ELSE f.CODIGO 
       END + '|' + '0' + '|' +
       CASE 
          WHEN f.NOMBRE =''  THEN 'Clientes varios' 
          ELSE f.NOMBRE  
       END + '|PEN|' +
       CONVERT(varchar(13), (CAST(f.SUBTOTAL AS decimal(10, 2)))) + 
       '|0.00|0.00|' +
       CONVERT(varchar(13), (CAST(f.IMPUESTO AS decimal(10, 2)))) + 
       '|0.00|0.00|0.00|0.00|' +
       CONVERT(varchar(13), (cast(f.TOTAL as  decimal(10, 2)))) + '|0.00|0.00|' +
       'MONTO TOTAL' + '|||||||1000||||0.00|0.00|0.00||' + CHAR(13) + CHAR(10) HeaderData,
  --DETAIL(DF)
  'DB' + '|' + 'NUMBER OF ROW' + '|' + d.PRODUCTO + '|' + 'NIU' + '|' + '1' + '|' +
     d.DESCRIPCIO + '|' + CONVERT(varchar(13),(ROUND((d.PRECIO/1.18), 2))) + '|' +
     CONVERT(varchar(13), (cast(d.PRECIO as decimal(10, 2)))) + '|' +
     CONVERT(varchar(13), (ROUND(((d.PRECIO/1.18) * 0.18), 2))) + '|10|0.00||' +
     CONVERT(varchar(13), (cast(d.TOTAL as decimal(10, 2)))) + '|0.00||0.00||' DetailData
FROM    factura f FULL JOIN    detalle d ON f.NUMERO = d.NUMERO 
        FULL JOIN    clientes c ON f.CODIGO = c.codigo
    )

    select HeaderData+STUFF((SELECT '|'+ DetailData
                             FROM CTE C
                             WHERE C.HeaderData=T.HeaderData
                             FOR XML PATH('')),1,1,'')
    FROM CTE T
    GROUP BY HeaderData

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2010-12-25
    • 2011-05-28
    • 2017-08-06
    • 2014-11-10
    • 2020-03-01
    • 2013-08-18
    • 2014-03-11
    • 2015-12-30
    相关资源
    最近更新 更多