Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Здравствуйте!

Есть рабочий SQL-запрос, который вначале удаляет все строки в таблице в базе данных, потом выгружает данные за январь 2014 г., далее заносит полученные строки в таблицу базы данных.
+SQL-запрос
IF (SELECT count(*)  FROM dbo.Table1) > 0 
    DELETE FROM dbo.Table1;
GO

WITH
TempTable AS (
SELECT
	CAST(F1."[Торговые точки].[Клиент].[Клиент].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Клиент],
	CAST(F1."[Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код ТТ],
	CAST(F1."[Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код продукции],	
	CONVERT(nvarchar(10), F1."[Время].[Дата].[Дата].[MEMBER_CAPTION]" , 104) AS [Дата],
	F1."[Measures].[Отгрузки шт]" AS [Отгрузки шт],
	F1."[Measures].[Возвраты шт]" AS [Возвраты шт],
	F1."[Measures].[Реализация шт]" AS [Реализация шт],
FROM
        OPENROWSET('MSOLAP',,'Provider=...',
	'SELECT
	{[Measures].[Отгрузки шт],
	[Measures].[Возвраты шт],	
	[Measures].[Реализация шт]}
ON 0,
NON EMPTY
	[Торговые точки].[Клиент].[Клиент]*
	[Торговые точки].[Код ТТ].[Код ТТ]*
	[Продукция].[Код продукции].[Код продукции]*	
	[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2014-01-01T00:00:00],
		[Торговые точки].[Клиент].&[42],
		[Продукция].[Тип продукции].&[1],
		[Города].[Город].&[7]) ON 0 FROM PROFIT)'
	) AS F1
)

INSERT INTO
	dbo.Table1 (
		[Клиент],
		[Код ТТ],
		[Код продукции],	
		[Дата],
		[Отгрузки шт],
		[Возвраты шт],
		[Реализация шт])
SELECT
	[Клиент],
	[Код ТТ],
	[Код продукции],	
	[Дата],
	[Отгрузки шт],
	[Возвраты шт],
	[Реализация шт]	
FROM
	TempTable
Скажите, как написать SQL-запрос так, чтобы работал цикл? То есть выгружались строки сначала за январь 2014 г и сохранял строки в таблицу, потом выгружал строки за февраль 2014 г и добавлял строки в таблицу, и до декабря 2017 года.

Специально в SQL-запросе используется Openrowset с MDX-запросом. Сразу за 2014-2017 гг не выгружаются данные. Учитывая, что если выгружать за январь 2014 года с нулевыми датами (если в MDX-запросе убрать NON EMPTY), то данные не выгрузятся. Также не обращайте внимание, что поля на русском языке.
22 мар 18, 08:29    [21276155]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
формировать строку запроса динамикой, выполнять в цикле.
22 мар 18, 10:01    [21276320]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
ferzmikk,

DECLARE @DT DATE = '2014-01-01'
WHILE @DT <= '2017-12-01'
BEGIN
	PRINT @DT

	-- put your dynamic query here

	SET @DT = DATEADD(MONTH, 1, @DT)
END
22 мар 18, 21:20    [21278911]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Mind,

Дата находится в MDX-запросе внутри SQL-запроса и указывается в таком формате [Время].[Месяц].&[2014-01-01T00:00:00]. Получается дату вставлять надо примерно так
'[Время].[Месяц].&[' + Год() + '-' + Месяц() + '-01T00:00:00]'

Причем номер месяца, например, январь, должен отображаться не как '1', а как '01'.

Получился такой запрос, но в номере месяца до октября отсутствует нужный ноль .
DECLARE @DT DATE = '2014-01-01'
WHILE @DT <= '2017-12-01'
BEGIN
	PRINT  '[Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + convert(nvarchar(10),MONTH(@DT),02 ) + '-01T00:00:00]'
	SET @DT = DATEADD(MONTH, 1, @DT)
END

Как правильно написать?
23 мар 18, 09:13    [21279473]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
кролик-зануда
Guest
ferzmikk,
right('00'+cast(MONTH(@DT) as varchar),2)
23 мар 18, 09:20    [21279501]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
кролик-зануда,

Получилось, спасибо!
23 мар 18, 10:35    [21279807]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Вставляю условие в основной код и показывает ошибку.

Что тут не так?

К сообщению приложен файл. Размер - 20Kb
23 мар 18, 10:48    [21279867]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
ferzmikk,

DECLARE @DT DATE = '2014-01-01'
WHILE @DT <= '2017-12-01'
BEGIN
	PRINT  '[Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+convert(nvarchar(10),MONTH(@DT),02 ),2) + '-01T00:00:00]'
	SET @DT = DATEADD(MONTH, 1, @DT)
END
23 мар 18, 12:18    [21280278]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
ferzmikk
Вставляю условие в основной код и показывает ошибку.

Что тут не так?

В общем весь запрос
+SQL-Запрос
IF (SELECT count(*)  FROM dbo.Table1) > 0 
    DELETE FROM dbo.Table1;
GO

DECLARE @DT DATE = '2014-01-01';

WHILE @DT <= '2017-12-01'
BEGIN

	PRINT  '[Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as varchar),2) + '-01T00:00:00]';
        --Выгружаем за определенный месяц и год
	WITH
	TempTable AS (
	SELECT
		CAST(F1."[Торговые точки].[Клиент].[Клиент].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Клиент],
		CAST(F1."[Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код ТТ],
		CAST(F1."[Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код продукции],	
		CONVERT(nvarchar(10), F1."[Время].[Дата].[Дата].[MEMBER_CAPTION]" , 104) AS [Дата],
		F1."[Measures].[Отгрузки шт]" AS [Отгрузки шт],
		F1."[Measures].[Возвраты шт]" AS [Возвраты шт],
		F1."[Measures].[Реализация шт]" AS [Реализация шт],
	FROM
	        OPENROWSET('MSOLAP',,'Provider=...',
		'SELECT
		{[Measures].[Отгрузки шт],
		[Measures].[Возвраты шт],	
		[Measures].[Реализация шт]}
	ON 0,	
	NON EMPTY
		[Торговые точки].[Клиент].[Клиент]*
		[Торговые точки].[Код ТТ].[Код ТТ]*
		[Продукция].[Код продукции].[Код продукции]*	
		[Время].[Дата].[Дата]
	ON 1
	FROM
		(SELECT
			([Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as varchar),2) + '-01T00:00:00],
			[Торговые точки].[Клиент].&[42],
			[Продукция].[Тип продукции].&[1],
			[Города].[Город].&[7]) ON 0 FROM PROFIT)'
		) AS F1
	)
        --Полученные строки добавляются в таблицу Table1
	INSERT INTO
		dbo.Table1 (
			[Клиент],
			[Код ТТ],
			[Код продукции],	
			[Дата],
			[Отгрузки шт],
			[Возвраты шт],
			[Реализация шт])
	SELECT
		[Клиент],
		[Код ТТ],
		[Код продукции],	
		[Дата],
		[Отгрузки шт],
		[Возвраты шт],
		[Реализация шт]	
	FROM
		TempTable

	SET @DT = DATEADD(MONTH, 1, @DT)
END

Выдает ошибку
Сообщение 102, уровень 15, состояние 1, строка 43
Неправильный синтаксис около конструкции "+"."
23 мар 18, 13:12    [21280513]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ferzmikk,

запрос в переменну, потом в OPENROWSET
23 мар 18, 13:18    [21280557]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
		([Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as [b]nvarchar[/b]),2) + '-01T00:00:00],


бо похоже что у вас в итоге абракадарба а не мдикс
23 мар 18, 13:26    [21280597]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
		([Время].[Год].&[' + CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as [b]nvarchar[/b]),2) + '-01T00:00:00],



бо похоже что у вас в итоге абракадарба а не мдикс

приведите все к типу nvarchar я хотел сказать:)
23 мар 18, 13:34    [21280651]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Maxx
		([Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as [b]nvarchar[/b]),2) + '-01T00:00:00],


бо похоже что у вас в итоге абракадарба а не мдикс

([Время].[Год].&[' +  CONVERT(nvarchar(4),YEAR(@DT) ) + '-' + right('00'+CONVERT(nvarchar(2),MONTH(@DT)),2) + '-01T00:00:00],
23 мар 18, 13:37    [21280675]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ferzmikk,

в итоге работает нет ?
23 мар 18, 13:51    [21280751]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Maxx
ferzmikk,

в итоге работает нет ?

также
23 мар 18, 13:55    [21280768]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
весь оперроусет в строку и выведите принтом. Чудес не бывает
23 мар 18, 14:08    [21280821]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
весь оперроусет в строку и выведите принтом. Чудес не бывает

нет еснно не бывет

OPENROWSET does not accept variables for its arguments.
23 мар 18, 14:18    [21280867]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
+ как-то так
DECLARE @DT DATETIME = '20170101'
DECLARE @tSQL NVARCHAR(MAX)
DECLARE @tOLAP NVARCHAR(MAX)
WHILE @DT <= '20171201'
BEGIN
  SET @tOLAP = '
SELECT {
  [Measures].[Отгрузки шт],
  [Measures].[Возвраты шт],	
  [Measures].[Реализация шт] }
ON 0,
NON EMPTY
	[Торговые точки].[Клиент].[Клиент]*
	[Торговые точки].[Код ТТ].[Код ТТ]*
	[Продукция].[Код продукции].[Код продукции]*	
	[Время].[Дата].[Дата]
ON 1
FROM (
  SELECT (
    [Время].[Месяц].&[' + CONVERT( VARCHAR, @DT, 127 ) + '],
    [Торговые точки].[Клиент].&[42],
    [Продукция].[Тип продукции].&[1],
    [Города].[Город].&[7] ) 
  ON 0
  FROM
    PROFIT
)'
  ;
  SET @tSQL = '
SELECT
  CAST(F1."[Торговые точки].[Клиент].[Клиент].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Клиент],
  CAST(F1."[Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код ТТ],
  CAST(F1."[Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код продукции],	
  CONVERT(nvarchar(10), F1."[Время].[Дата].[Дата].[MEMBER_CAPTION]" , 104) AS [Дата],
  F1."[Measures].[Отгрузки шт]" AS [Отгрузки шт],
  F1."[Measures].[Возвраты шт]" AS [Возвраты шт],
  F1."[Measures].[Реализация шт]" AS [Реализация шт],
FROM
  OPENROWSET( ''MSOLAP'',, ''Provider=...'', 
    ''' + @tOLAP + '''
  ) AS F1
;'
  ;
  PRINT @tSQL
  ;
  /*
  INSERT
  INTO
    dbo.Table1 (
      [Клиент],
      [Код ТТ],
      [Код продукции],	
      [Дата],
      [Отгрузки шт],
      [Возвраты шт],
      [Реализация шт])
  EXEC( @tSQL )
  */
  ;
	SET @DT = DATEADD(MONTH, 1, @DT)
END
23 мар 18, 15:49    [21281246]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
При запуске пишет Ошибка при преобразовании типа данных nvarchar к numeric.. Это все из за поля [Реализация сумма без НДС].

К сообщению приложен файл. Размер - 60Kb
24 мар 18, 10:57    [21282671]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056


К сообщению приложен файл. Размер - 14Kb
24 мар 18, 10:58    [21282674]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
Почему пишет Numeric, если задан decimal(18,2)? Как исправить?
24 мар 18, 11:00    [21282676]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
ferzmikk
Почему пишет Numeric, если задан decimal(18,2)? Как исправить?
Никак не исправить, это синонимы.
24 мар 18, 12:01    [21282746]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
ferzmikk
Member

Откуда:
Сообщений: 2056
alexeyvg
ferzmikk
Почему пишет Numeric, если задан decimal(18,2)? Как исправить?
Никак не исправить, это синонимы.

И как быть теперь?
24 мар 18, 13:13    [21282855]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
ferzmikk,

что вам это нумерик если у вас проблема с варчаром?
посмотрите, что вам возвращает в этом поле ваш запрос без конвертации (может у вас там разделитель дробной части не тот).
24 мар 18, 13:20    [21282866]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос. Вставить циклы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
ferzmikk
alexeyvg
пропущено...
Никак не исправить, это синонимы.

И как быть теперь?
Вы про что спрашиваете?

Вы спросили, почему ошибка с DECIMAL, а сервер пишет про NUMERIC?

Я вам ответил - это нормально, это описано в документации, и ничего страшного в этом нет, просто забейте. Лучше разбирайтесь с самой ошибкой.
24 мар 18, 14:42    [21282993]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить