【发布时间】: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