Процедура sql для экспорта отдельных файлов txt

У меня есть sql-запрос, который представляет собой прайс-лист, который я обычно запускаю 18 раз для 18 разных клиентов. У меня есть объявление @varchar, и я меняю идентификатор клиента. Затем он экспортирует плоский файл txt, чтобы я мог преобразовать его в Excel и отправить через Feebootimail.

Есть ли процедура, которую я могу запустить в sql 2005, чтобы я мог передать список клиентов и получить 18 различных файлов txt? пример Pricelist_8343.txt, Pricelist_8363.txt и т. д.


DECLARE @CustNum varchar(20)
SELECT @CustNum = '7509'

SELECT
it.ITEMID 'item id'
,it.ItemGroupID
,it.ITEMNAME
,Convert(Decimal(9,0),itm.QUANTITY) 'Sales Multiple'
,Convert(Decimal(9,0),it.TAXPACKAGINGQTY) 'Price Break Qty'
,Convert(Decimal(9,0),it.OUTERQUANTITY) 'Carton Qty'
,Convert(Decimal(9,2),itm.PRICE) 'Part Pack'
,Convert(Decimal(9,2),itm.PRICE2) 'Full Pack'
,Convert(Decimal(9,2),round( CASE 
WHEN pdt.AMOUNT >0 then pdt.amount
else CASE
 when pdt.discpct is null then CASE
    WHEN pdt.PRICELEVELTOUSE = 0 then Price
    WHEN pdt.PRICELEVELTOUSE = 1 then Price2
    WHEN pdt.PRICELEVELTOUSE = 2 then Price3
    WHEN pdt.PRICELEVELTOUSE = 3 then Price4
    WHEN pdt.PRICELEVELTOUSE = 4 then Price5 
    WHEN pdt.PRICELEVELTOUSE = 5 then Price6 END
 when pdt.discpct = 0 then CASE
    WHEN pdt.PRICELEVELTOUSE = 0 then Price
    WHEN pdt.PRICELEVELTOUSE = 1 then Price2
    WHEN pdt.PRICELEVELTOUSE = 2 then Price3
    WHEN pdt.PRICELEVELTOUSE = 3 then Price4
    WHEN pdt.PRICELEVELTOUSE = 4 then Price5 
    WHEN pdt.PRICELEVELTOUSE = 5 then Price6 END
 when pdt.discpct > 0 then CASE
    WHEN pdt.PRICELEVELTOUSE = 0 then round(itm.price - (itm.price*pdt.discpct/100),2)
    WHEN pdt.PRICELEVELTOUSE = 1 then round(itm.price2 - (itm.price2*pdt.discpct/100),2)
    WHEN pdt.PRICELEVELTOUSE = 2 then round(itm.price3 - (itm.price3*pdt.discpct/100),2)
    WHEN pdt.PRICELEVELTOUSE = 3 then round(itm.price4 - (itm.price4*pdt.discpct/100),2)
    WHEN pdt.PRICELEVELTOUSE = 4 then round(itm.price5 - (itm.price5*pdt.discpct/100),2)
    WHEN pdt.PRICELEVELTOUSE = 5 then round(itm.price6 - (itm.price6*pdt.discpct/100),2) END END END ,2)) as 'TAPrice'
,upper(itm.unitid) 'UOM'
,     Case
            When itm.PRICECHANGESTATUS=3 then 'Increase'
            When itm.PRICECHANGESTATUS=2 then 'Decrease'
            When itm.PRICECHANGESTATUS=1 then 'New Item'
            When itm.PRICECHANGESTATUS=0 then '-'
      END 'Price Indicator'
from  INVENTTABLE it
join  INVENTTABLEMODULE itm   on it.ItemId = itm.ItemID and itm.ModuleType = 2
join  CUSTTABLE cust on LTRIM(cust.AccountNum) = @CustNum
left outer join   PRICEDISCTABLE pdt on (ltrim(pdt.accountrelation) = 
    case
    when pdt.accountcode = 0 then ltrim(cust.accountnum) 
    when pdt.accountcode = 1 then ltrim(cust.pricegroup) end)and
      (ltrim(pdt.ItemRelation)+ltrim(pdt.UnitID) = case
        when pdt.itemrelation = it.itemid then ltrim(it.ItemID)+ltrim(itm.Unitid)
        when pdt.itemrelation = it.itempricegroup then  ltrim(it.ItemPriceGroup)+ltrim(itm.Unitid)end
        ) and pdt.fromdate <= getdate() and (getdate()<= pdt.todate or pdt.todate = ' ')
join  PriceLevelListReportLine sorter on it.ItemGroupID  = sorter.ItemGroupID
and (it.ItemType = (case when sorter.linetype = 0 then '0'
      when sorter.linetype = 1 then '0'
      when sorter.linetype = 2 then '1'end)

or it.ItemType = (case when sorter.linetype = 1 then '1' end))
WHERE it.PRICELISTFlag=1
ORDER BY sorter.SortOrder, it.ItemID

person Makdaddy    schedule 11.12.2012    source источник


Ответы (1)


Вы можете сделать это с помощью SQLCMD и пакетного файла.

Создайте файл script.sql с таким содержимым:

declare @CustNum varchar(20) = '$(custnum)'
select
   -- your giant query here

Затем создайте пакетный файл, который выглядит следующим образом:

@echo off

set custnum=1234
call :export

set custnum=5678
call :export

set custnum=9012
call :export

goto :eof
:export
sqlcmd -E  -i script.sql -o %custnum%.txt -v CustNum=%custnum%
goto :eof

Скопируйте и вставьте строки set/call один раз для каждого из ваших 18 клиентов.

Вместо копирования + вставки вы можете сделать что-то с циклом for, если у вас где-то есть список клиентов - вывод другого запроса SQLCMD или просто текстовый файл. Я оставляю это вам, чтобы понять.

person Blorgbeard    schedule 12.12.2012