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

Есть рабочий 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
SQL-запрос. Вставить циклы
    #39618656
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
формировать строку запроса динамикой, выполнять в цикле.
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619145
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос. Вставить циклы
    #39619261
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос. Вставить циклы
    #39619269
ferzmikk,
Код: sql
1.
right('00'+cast(MONTH(@DT) as varchar),2)
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619321
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кролик-зануда,

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

Что тут не так?
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619406
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос. Вставить циклы
    #39619449
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос. Вставить циклы
    #39619458
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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



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




бо похоже что у вас в итоге абракадарба а не мдикс
приведите все к типу nvarchar я хотел сказать:)
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619484
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос. Вставить циклы
    #39619505
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

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

OPENROWSET does not accept variables for its arguments.
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619603
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так
Код: 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
SQL-запрос. Вставить циклы
    #39619929
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При запуске пишет Ошибка при преобразовании типа данных nvarchar к numeric. . Это все из за поля [Реализация сумма без НДС] .
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619930
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619931
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему пишет Numeric, если задан decimal(18,2)? Как исправить?
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619938
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkПочему пишет Numeric, если задан decimal(18,2)? Как исправить?Никак не исправить, это синонимы.
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619949
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgferzmikkПочему пишет Numeric, если задан decimal(18,2)? Как исправить?Никак не исправить, это синонимы.
И как быть теперь?
...
Рейтинг: 0 / 0
SQL-запрос. Вставить циклы
    #39619950
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

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

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


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