将数据导出到csv就像MSSQL中的文件

时间:2018-10-01 13:02:47

标签: sql-server tsql

让我们说类似csv的文件正在存储发票,它看起来像:(两个csv文件的架构合并在一起)

InvID |Seller    |Buyer    |Date     |Sum
1     |SomeSeller|SomeBuyer|2018-10-1|123.00
PositionNumber|ItemName|Quantity|Price
1             |Item1   |2       |10.00
2             |Item2   |1       |90.00
3             |Item3   |4       |23.00
InvID|Seller    |Buyer    |Date     |Sum
2    |SomeSeller|SomeBuyer|2018-10-1|123.00
PositionNumber|ItemName|Quantity|Price
1             |Item1   |2       |10.00
2             |Item2   |1       |90.00
3             |Item3   |4       |23.00
InvID|Seller    |Buyer    |Date     |Sum
3    |SomeSeller|SomeBuyer|2018-10-1|123.00
PositionNumber|ItemName|Quantity|Price
1             |Item1   |2       |10.00
2             |Item2   |1       |90.00
3             |Item3   |4       |23.00

最简单的方法是什么?我当时正在考虑使用游标并将发票抬头和发票项目的结果粘贴在一起,并针对每张发票重复该结果,但是也许有一些更简单的方法可以做到这一点。

得到这种东西的正确方法是什么?

它必须每天运行。因此必须有可能将其附加到sql服务器作业

2 个答案:

答案 0 :(得分:1)

嗯,这有点棘手...

尝试此查询:

我正在模拟独立测试场景(针对以后的问题:请尝试在您的问题中提供此类MCVE)

DECLARE @tblInv TABLE(InvID INT,Seller VARCHAR(100),Buyer VARCHAR(100),[Date] DATE);
INSERT INTO @tblInv VALUES(1,'Seller 1','Buyer 1','20180101')
                         ,(2,'Seller 2','Buyer 2','20180202');

DECLARE @tblPos TABLE(PosID INT, InvID INT, PositionNumber INT, ItemName VARCHAR(100),Quantity INT,Price DECIMAL(14,4));
INSERT INTO @tblPos VALUES(1,1,1,'Item 1 in 1',11,1.1)
                         ,(2,1,2,'Item 2 in 1',12,1.2) 
                         ,(3,2,1,'Item 1 in 2',21,2.1) 
                         ,(4,2,2,'Item 2 in 2',22,2.2) 
                         ,(5,2,3,'Item 3 in 2',23,2.3);

-查询会将结果分配给变量@Result

DECLARE @Result NVARCHAR(MAX)=
(                       
    SELECT CONCAT('InvID|Seller|Buyer|Date|Sum',CHAR(13) + CHAR(10)
                 ,i.InvID,'|'
                 ,i.Seller,'|'
                 ,i.Buyer,'|'
                 ,i.[Date],'|'
                 ,(SELECT SUM(Price) FROM @tblPos x WHERE x.InvID=i.InvID),CHAR(13) + CHAR(10)
                 ,'PositionNumber|ItemName|Quantity|Price',CHAR(13) + CHAR(10)
                 ,(
                    SELECT CONCAT(p.PositionNumber,'|'
                                 ,p.ItemName,'|'
                                 ,p.Quantity,'|'
                                 ,p.Price,CHAR(13) + CHAR(10))
                    FROM @tblPos p
                    WHERE p.InvID=i.InvID
                    ORDER BY p.PositionNumber
                    FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
                  )
    FROM @tblInv i
    FOR XML PATH(''),TYPE
).value('.','nvarchar(max)');

-这将打印出结果(使用PRINT或选择结果为文本

PRINT @Result;

结果

InvID|Seller|Buyer|Date|Sum
1|Seller 1|Buyer 1|2018-01-01|2.3000
PositionNumber|ItemName|Quantity|Price
1|Item 1 in 1|11|1.1000
2|Item 2 in 1|12|1.2000
InvID|Seller|Buyer|Date|Sum
2|Seller 2|Buyer 2|2018-02-02|6.6000
PositionNumber|ItemName|Quantity|Price
1|Item 1 in 2|21|2.1000
2|Item 2 in 2|22|2.2000
3|Item 3 in 2|23|2.3000

您可以使用BCP将其写出到文件中。周围有很多示例(一个是here

答案 1 :(得分:0)

不久前,我发布了answer,介绍了如何使用PowerShell(我的首选方法)进行此操作。

但是肉和土豆就像:

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation