Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выгрузка в CSV  [new]
asmotin
Member

Откуда:
Сообщений: 2
Добрый день. Помогите разобраться с задачей. Необходимо автоматизировать процесс выгрузки данных из базы MSSQL2012 в файл csv. Выгрузка должна происходить каждый день. В базе данные имеют метку "ДатаСмены". Выгрузка должна доставать вчерашние данные.

На данный момент получилось с помощью SQLCMD.EXE настроить в ручном режиме. Проблема как передать переменные вчерашней даты?


"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S 127.0.0.1 -U sa -P 123456789 -d "BR_RK7_MAIN" -h -1 -v DATE1="2017-04-14T00:00:00" DATE2="2017-04-14T00:00:00" -s ',' -i "105829.sql" -o "105829.csv"

/* расход блюд, доработка под #105829 */

declare @dt datetime, @dt1 datetime, @dt2 datetime, @infoflag int, @info nvarchar(6), @classif int, @fiscaldevice nvarchar(20)

set @dt1 = /*'2017-04-14T00:00:00'*/'$(DATE1)';
set @dt2 = /*'2017-04-14T00:00:00'*/'$(DATE2)';
/*set @infoflag = 0--:UPDATE;
set @info = case @infoflag when 0 then 'Normal' when 1 then 'Update' else ' ' end;*/

--ищем код классификации БУХГАЛТЕРИЯ по ее имени (подставить имя после like)
select @classif= sifr*256 from CLASSIFICATORGROUPS where NUMINGROUP=0 and name like 'Классификация'

--задаем серийный номер фискальника
set @fiscaldevice = '123456789'

SELECT 
  PrintChecks00.CHECKNUM,
  iif(SessionDishes00.SORTORDER=0,1001,0) as IsFirstDishInCheck,
  --PrintChecks00.CLOSEDATETIME,
  DATEPART(YEAR,PrintChecks00.CLOSEDATETIME) as CHECKYEAR,
  DATEPART(MONTH,PrintChecks00.CLOSEDATETIME) as CHECKMONTH,
  DATEPART(DAY,PrintChecks00.CLOSEDATETIME) as CHECKDAY,
  DATEPART(HOUR,PrintChecks00.CLOSEDATETIME) as CHECKHOUR,
  DATEPART(MINUTE,PrintChecks00.CLOSEDATETIME) as CHECKMINUTE,
  DATEPART(SECOND,PrintChecks00.CLOSEDATETIME) as CHECKSECOND,
  CLASSIFICATORGROUPS0000.CODE as SpecialClassifCode,
  SaleObjects00.CODE,
  iif(DISCOUNTS.SUM01 <> 0,
    '1//'+cast(iif(DISCOUNTS.SUM00 <> 0 and DISCOUNTS.SUM01 <> 0,15,iif(DISCOUNTS.SUM01 <> 0,11,33)) as varchar(10)),
	'0//33'
  ) as DiscKind,
  isnull(DISCOUNTS.CARDCODE,'') as CARDCODE,
  SessionDishes00.PRLISTSUM,
  SessionDishes00.QUANTITY,
  SaleObjects00.Name,
  SessionDishes00.PAYSUM,
--  DISCOUNTS.SUM00 as ManDiscSum,
--  DISCOUNTS.SUM01 as CardDiscSum,
  DISCOUNTS.SUM00 + DISCOUNTS.SUM01 as DISCSUM,
  DISCOUNTS.SUM00 + DISCOUNTS.SUM01 as DISCREALSUM,
  iif(DISCOUNTS.SUM00 <> 0 and DISCOUNTS.SUM01 <> 0,
    cast(DISCOUNTS.SUM00 as varchar(10))+'//'+cast(DISCOUNTS.SUM01 as varchar(10)),
	iif(DISCOUNTS.SUM00 = 0,
	  cast(DISCOUNTS.SUM01 as varchar(10)),
	  cast(DISCOUNTS.SUM00 as varchar(10))))  as DiscByKind,
  @fiscaldevice as FiscalDeviceNum,
  isnull(right(PE00.CARDNUM,4),'') as CreditCard,
  iif(PORTIONWEIGHT <> 0 and PORTIONNAME <> '',1,2) as MeasureUnitType,
  EMPLOYEES00.NAME as CashierName
FROM PAYBINDINGS
JOIN CurrLines CurrLines00
  ON (CurrLines00.Visit = PayBindings.Visit) AND (CurrLines00.MidServer = PayBindings.MidServer) AND (CurrLines00.UNI = PayBindings.CurrUNI)
JOIN PrintChecks PrintChecks00
  ON (PrintChecks00.Visit = CurrLines00.Visit) AND (PrintChecks00.MidServer = CurrLines00.MidServer) AND (PrintChecks00.UNI = CurrLines00.CheckUNI)
JOIN Orders Orders00
  ON (Orders00.Visit = PayBindings.Visit) AND (Orders00.MidServer = PayBindings.MidServer) AND (Orders00.IdentInVisit = PayBindings.OrderIdent)
JOIN GLOBALSHIFTS GLOBALSHIFTS00
  ON (GLOBALSHIFTS00.MidServer = Orders00.MidServer) AND (GLOBALSHIFTS00.ShiftNum = Orders00.iCommonShift)
LEFT JOIN PAYMENTS P00
  ON P00.MIDSERVER=PrintChecks00.MIDSERVER and P00.VISIT = PrintChecks00.VISIT and P00.ORDERIDENT = PrintChecks00.ORDERIDENT and P00.PRINTCHECKUNI = PrintChecks00.UNI and P00.CHANGEFORCURR = 0
LEFT JOIN PAYMENTSEXTRA PE00
  ON PE00.MIDSERVER=PrintChecks00.MIDSERVER and PE00.VISIT = PrintChecks00.VISIT and PE00.PAYUNI=P00.UNI
LEFT JOIN EMPLOYEES EMPLOYEES00
  ON (EMPLOYEES00.SIFR = PrintChecks00.IAUTHOR)
LEFT JOIN SaleObjects SaleObjects00
  ON (SaleObjects00.Visit = PayBindings.Visit) AND (SaleObjects00.MidServer = PayBindings.MidServer) AND (SaleObjects00.DishUNI = PayBindings.DishUNI) AND (SaleObjects00.ChargeUNI = PayBindings.ChargeUNI)
LEFT JOIN SessionDishes SessionDishes00
  ON (SessionDishes00.Visit = SaleObjects00.Visit) AND (SessionDishes00.MidServer = SaleObjects00.MidServer) AND (SessionDishes00.UNI = SaleObjects00.DishUNI)
LEFT JOIN MENUITEMS MENUITEMS00
  ON (MENUITEMS00.SIFR = SessionDishes00.Sifr)
LEFT JOIN DISHGROUPS DISHGROUPS0000
  ON (DISHGROUPS0000.CHILD = MENUITEMS00.SIFR) AND (DISHGROUPS0000.CLASSIFICATION = @classif)
LEFT JOIN CLASSIFICATORGROUPS CLASSIFICATORGROUPS0000
  ON CLASSIFICATORGROUPS0000.SIFR * 256 + CLASSIFICATORGROUPS0000.NumInGroup = DISHGROUPS0000.PARENT  
LEFT JOIN (
	select  
	DISCPARTS00.VISIT,
	DISCPARTS00.MIDSERVER,
	DISCPARTS00.ORDERIDENT,
	DISCPARTS00.BINDINGUNI,
	sum(iif(DishDiscounts00.sifr is null,0,sum)) SUM00,
	sum(iif(DishDiscounts01.sifr is null,0,sum)) SUM01,
	max(DishDiscounts00.SIFR) DicsM,
	max(DishDiscounts01.SIFR) DiscC,
	max(DishDiscounts01.CARDCODE) CARDCODE
	from 
	DISCPARTS DISCPARTS00
	LEFT JOIN DISHDISCOUNTS DishDiscounts00
	  ON DishDiscounts00.VISIT = DISCPARTS00.VISIT and DishDiscounts00.MIDSERVER = DISCPARTS00.MIDSERVER and DishDiscounts00.ORDERIDENT = DISCPARTS00.ORDERIDENT and DishDiscounts00.UNI = DISCPARTS00.DISCLINEUNI and DishDiscounts00.CHARGESOURCE = 0
	LEFT JOIN DISHDISCOUNTS DishDiscounts01
	  ON DishDiscounts01.VISIT = DISCPARTS00.VISIT and DishDiscounts01.MIDSERVER = DISCPARTS00.MIDSERVER and DishDiscounts01.ORDERIDENT = DISCPARTS00.ORDERIDENT and DishDiscounts01.UNI = DISCPARTS00.DISCLINEUNI and DishDiscounts01.CHARGESOURCE <> 0
	group by DISCPARTS00.VISIT,
	DISCPARTS00.MIDSERVER,
	DISCPARTS00.ORDERIDENT,
	DISCPARTS00.BINDINGUNI
) DISCOUNTS
  ON DISCOUNTS.VISIT = PAYBINDINGS.VISIT and DISCOUNTS.MIDSERVER = PAYBINDINGS.MIDSERVER and DISCOUNTS.ORDERIDENT = PAYBINDINGS.ORDERIDENT and DISCOUNTS.BINDINGUNI = PAYBINDINGS.UNI
WHERE
  (PrintChecks00.STATE = 6)
  AND (GLOBALSHIFTS00.STATUS = 3)
  AND (GLOBALSHIFTS00.SHIFTDATE BETWEEN DATEADD(DAY,DATEDIFF(DAY,0,@DT1),0) AND DATEADD(DAY,DATEDIFF(DAY,0,@DT2),0))


Проблема как передать переменные вчерашней даты?
9 май 17, 11:27    [20466270]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в CSV  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
asmotin
Проблема как передать переменные вчерашней даты?
Эээ, передавайте в вызове SQLCMD любые даты, которые хотите.
Или вычисляйте нужную дату прямо в скрипте.

Пока непонятна ваша проблема.
9 май 17, 11:51    [20466300]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в CSV  [new]
asmotin
Member

Откуда:
Сообщений: 2
alexeyvg
asmotin
Проблема как передать переменные вчерашней даты?
Эээ, передавайте в вызове SQLCMD любые даты, которые хотите.
Или вычисляйте нужную дату прямо в скрипте.

Пока непонятна ваша проблема.

Проблема в том что дата должна высчитываться автоматически каждый день. в cmd не получается передать вчерашнюю дату. Подскажите как в скрипте вычислить? Спасибо.
10 май 17, 08:39    [20467725]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в CSV  [new]
uaggster
Member

Откуда:
Сообщений: 827
asmotin
alexeyvg
пропущено...
Эээ, передавайте в вызове SQLCMD любые даты, которые хотите.
Или вычисляйте нужную дату прямо в скрипте.

Пока непонятна ваша проблема.

Проблема в том что дата должна высчитываться автоматически каждый день. в cmd не получается передать вчерашнюю дату. Подскажите как в скрипте вычислить? Спасибо.

Ну, если ван нужна конкретно вчерашняя дата, то вычисляйте ее как Select Cast(Dateadd(day, 1, getdate()) as date) прямо в выражении.
Другое дело, если вы хотите получать данные на какую то произвольную, передаваемую внутрь скрипта дату.
Это делается с помощью переменных скрипта:
https://msdn.microsoft.com/ru-ru/library/ms188714.aspx
10 май 17, 08:56    [20467739]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в CSV  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
asmotin
alexeyvg
пропущено...
Эээ, передавайте в вызове SQLCMD любые даты, которые хотите.
Или вычисляйте нужную дату прямо в скрипте.

Пока непонятна ваша проблема.

Проблема в том что дата должна высчитываться автоматически каждый день. в cmd не получается передать вчерашнюю дату. Подскажите как в скрипте вычислить? Спасибо.
Ну как, просто берёте функцию получения сегодняшней даты, и вычитаете одни сутки.
-- set @dt1 = /*'2017-04-14T00:00:00'*/'$(DATE1)';
set @dt1 = dateadd(dd, -1, convert(date, getdate()))
10 май 17, 13:39    [20468992]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить