Экспорт данных в CSV-подобный файл в MSSQL - PullRequest
0 голосов
/ 01 октября 2018

Допустим, что в 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 job

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Ну, это немного сложно ...

Попробуйте этот запрос:

Я создаю автономный тестовый сценарий (для будущих вопросов): попробуйте указать такой 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, чтобы записать это в файл,Есть много примеров (один здесь )

0 голосов
/ 01 октября 2018

Некоторое время назад я опубликовал ответ о том, как это сделать с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...