Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL-запрос. Вставить циклы / 25 сообщений из 39, страница 1 из 2
22.03.2018, 08:29
    #39618615
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Здравствуйте!

Есть рабочий SQL-запрос, который вначале удаляет все строки в таблице в базе данных, потом выгружает данные за январь 2014 г., далее заносит полученные строки в таблицу базы данных.
SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
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 ), то данные не выгрузятся. Также не обращайте внимание, что поля на русском языке.
...
Рейтинг: 0 / 0
22.03.2018, 10:01
    #39618656
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
формировать строку запроса динамикой, выполнять в цикле.
...
Рейтинг: 0 / 0
22.03.2018, 21:20
    #39619145
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikk,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
23.03.2018, 09:13
    #39619261
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Mind,

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


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

Получился такой запрос, но в номере месяца до октября отсутствует нужный ноль .
Код: sql
1.
2.
3.
4.
5.
6.
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


Как правильно написать?
...
Рейтинг: 0 / 0
23.03.2018, 09:20
    #39619269
SQL-запрос. Вставить циклы
ferzmikk,
Код: sql
1.
right('00'+cast(MONTH(@DT) as varchar),2)
...
Рейтинг: 0 / 0
23.03.2018, 10:35
    #39619321
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
кролик-зануда,

Получилось, спасибо!
...
Рейтинг: 0 / 0
23.03.2018, 10:48
    #39619330
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Вставляю условие в основной код и показывает ошибку.

Что тут не так?
...
Рейтинг: 0 / 0
23.03.2018, 12:18
    #39619406
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikk,

Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
23.03.2018, 13:12
    #39619449
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikkВставляю условие в основной код и показывает ошибку.

Что тут не так?
В общем весь запрос
SQL-Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
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
Неправильный синтаксис около конструкции "+"."
...
Рейтинг: 0 / 0
23.03.2018, 13:18
    #39619458
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikk,

запрос в переменну, потом в OPENROWSET
...
Рейтинг: 0 / 0
23.03.2018, 13:26
    #39619468
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Код: sql
1.
		([Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as nvarchar),2) + '-01T00:00:00],



бо похоже что у вас в итоге абракадарба а не мдикс
...
Рейтинг: 0 / 0
23.03.2018, 13:34
    #39619481
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Maxx
Код: sql
1.
		([Время].[Год].&[' + CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as nvarchar),2) + '-01T00:00:00],




бо похоже что у вас в итоге абракадарба а не мдикс
приведите все к типу nvarchar я хотел сказать:)
...
Рейтинг: 0 / 0
23.03.2018, 13:37
    #39619484
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Maxx
Код: sql
1.
		([Время].[Год].&[' +  CONVERT(nvarchar(10),YEAR(@DT),4 ) + '-' + right('00'+cast(MONTH(@DT) as nvarchar),2) + '-01T00:00:00],



бо похоже что у вас в итоге абракадарба а не мдикс
Код: sql
1.
([Время].[Год].&[' +  CONVERT(nvarchar(4),YEAR(@DT) ) + '-' + right('00'+CONVERT(nvarchar(2),MONTH(@DT)),2) + '-01T00:00:00],
...
Рейтинг: 0 / 0
23.03.2018, 13:51
    #39619505
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikk,

в итоге работает нет ?
...
Рейтинг: 0 / 0
23.03.2018, 13:55
    #39619514
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Maxxferzmikk,

в итоге работает нет ?
также
...
Рейтинг: 0 / 0
23.03.2018, 14:08
    #39619530
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
весь оперроусет в строку и выведите принтом. Чудес не бывает
...
Рейтинг: 0 / 0
23.03.2018, 14:18
    #39619540
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Maxxвесь оперроусет в строку и выведите принтом. Чудес не бывает
нет еснно не бывет

OPENROWSET does not accept variables for its arguments.
...
Рейтинг: 0 / 0
23.03.2018, 15:49
    #39619603
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
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

...
Рейтинг: 0 / 0
24.03.2018, 10:57
    #39619929
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
При запуске пишет Ошибка при преобразовании типа данных nvarchar к numeric. . Это все из за поля [Реализация сумма без НДС] .
...
Рейтинг: 0 / 0
24.03.2018, 10:58
    #39619930
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
...
Рейтинг: 0 / 0
24.03.2018, 11:00
    #39619931
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
Почему пишет Numeric, если задан decimal(18,2)? Как исправить?
...
Рейтинг: 0 / 0
24.03.2018, 12:01
    #39619938
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikkПочему пишет Numeric, если задан decimal(18,2)? Как исправить?Никак не исправить, это синонимы.
...
Рейтинг: 0 / 0
24.03.2018, 13:13
    #39619949
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
alexeyvgferzmikkПочему пишет Numeric, если задан decimal(18,2)? Как исправить?Никак не исправить, это синонимы.
И как быть теперь?
...
Рейтинг: 0 / 0
24.03.2018, 13:20
    #39619950
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikk,

что вам это нумерик если у вас проблема с варчаром?
посмотрите, что вам возвращает в этом поле ваш запрос без конвертации (может у вас там разделитель дробной части не тот).
...
Рейтинг: 0 / 0
24.03.2018, 14:42
    #39619970
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вставить циклы
ferzmikkalexeyvgпропущено...
Никак не исправить, это синонимы.
И как быть теперь?Вы про что спрашиваете?

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

Я вам ответил - это нормально, это описано в документации, и ничего страшного в этом нет, просто забейте. Лучше разбирайтесь с самой ошибкой.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL-запрос. Вставить циклы / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]