Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all 7251 articles
Browse latest View live

как получить текст запроса из курсора?

$
0
0
ув. эксперты, подскажите, как можно получить текст запроса из курсора?
есть код курсора, что-то вроде FETCH API_CURSOR00000000012900D1, но как дальше раскрутить, ума не приложу

получаю его с помощью вот такого запроса:
select (select top 1 query_plan from sys.dm_exec_query_plan(ec.plan_handle)) as query_plan,
SUBSTRING(text,(statement_start_offset/2)+1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset
END - statement_start_offset)/2) + 1) AS statement_text,*
from sys.dm_exec_requests ec
CROSS APPLY master.sys.dm_exec_sql_text(ec.sql_handle) AS s

Случайный отбор строк по заданным условиям

$
0
0
Здравствуйте!

Есть такая задача. Нужно написать такой SQL-запрос, который случайно отбирает строки по определенным условиям. Виды отбора
1. Случайно отбирает ТТ по заданному проценту
2. Случайно отбирает ТТ по заданному проценту, так чтобы для каждого клиента пропорционально отбирались ТТ (у одного клиента могут больше одной ТТ).
3. Случайно отбирает ТТ по заданному количеству (не важно какой клиент)

Отбираются таким образом, что для каждого ТТ выгружаются все SKU и Дата.

Есть константа, который задает вид отбора.

Написал SQL-запрос, пока для третьего вида отбора. Но что то не получается. Как правильно дописать? Ошибка не из за Order By?

+SQL-запрос
DECLARE @Таблица table(	
	[Клиент] varchar(8),
	[Код юр лица] varchar(12),
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Отгрузки штук] integer	
	)	
;

INSERT INTO
  @Таблица
VALUES 
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '03.01.2014', 100)

--Тип отбора ТТ
--1. Случайно отбирает ТТ по заданному проценту
--2. Случайно отбирает ТТ по заданному проценту, так чтобы для каждого клиента пропорционально отбирались ТТ.
--3. Случайно отбирает ТТ по заданному количеству
DECLARE @ТипОтбора INTEGER =3;

--Для типа отбора ТТ 1 и 2
DECLARE @ЗаданныйПроцентТТВыборка decimal(2,2) = 0.07;
DECLARE @РасcчитанноеКоличествоТТ INTEGER;
--Для типа отбора ТТ 3
DECLARE @ЗаданноеКоличествоТТВыборка integer = 2;

SET @РасcчитанноеКоличествоТТ = ROUND (@ЗаданныйПроцентТТВыборка * (SELECT count(*) FROM @Таблица),0);

SELECT
	[Клиент],
	[Код юр лица],
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузки штук]
FROM
	@Таблица
INNER JOIN	
	(CASE
		WHEN @ТипОтбора= 1 THEN

		WHEN @ТипОтбора= 2 THEN

		WHEN @ТипОтбора= 3 THEN	
			(SELECT TOP 1 
				Таб1.[Код ТТ]	
			FROM
				(SElECT DISTINCT [Код ТТ] FROM @Таблица) AS Таб1
			ORDER BY
				NEWID()) AS ФИЛЬТР_ТТ
	END)
ON
	@Таблица.[Код ТТ] = ФИЛЬТР_ТТ.[Код ТТ]

Как вытащить подстроку?

$
0
0
Из строки типа
'{\буквыцифры\буквыцифры Roger Federer's streak}'

В общем случае из такой, могут быть вложения, но хотя бы для 2 уровней :

'{\буквыцифры\буквыцифры Roger Federer's {\буквыцифры\буквыцифры (Маня Шарапова-лучшая!)} streak}'

Ожидается результат:

Roger Federer's (Маня Шарапова-лучшая!) streak

Зачем нужно возвращать JSON?

$
0
0
Всем доброго времени суток!

Вопрос конкретно в том, скажем когда планируем новый проект, когда нужно использовать JSON?
Т.е. в каком случае обычный метод хуже? Это когда сервер приложений сам создает JSON?!

Понятное дело, что если есть файл с JSON и стоит задача все заинсертить.

Нигде не могу найти ответа на этот вопрос, скорее всего плохо ищу, подкиньте линк.

ошибка при установке SSRS

$
0
0
устанавливаю SSRS, проходит процесс установки и выдаётся ошибка: File format is not valid.
на диске имеется папка С:\ProgramFiles\SQL.....\MSRSS11.WW , служба создалась, состояние - запущено, но в свойствах в вкладке LogOn пишется Not Installed . В консоли SQL-сервера база данных не появилась. подскажите, почему возникла эта ошибка и как её исправить?

Некластеризованный индекс по SolarWinds

$
0
0
Добрый день!
Подскажите пожалуйста, мониторинг предлагает нижеследуюий план:
/*
Missing Index Details from 4035782168.sqlplan
The Query Processor estimates that implementing the following index could improve the query cost by 76.4989%.
*/

/*
USE [ccstat_data]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [log].[Application] ([Category],[Action],[Time])
INCLUDE ([ID],[SessionID],[Description])
GO
*/

Проблема в том что это он не предлагает к конкретной таблице. При запуске крутиться и всё.
Данную процедуру делал пару раз незнаю пока всех нюансов.

Bulk Load, создание большого количества таблиц

$
0
0
Имеется схема XSD, созданная мною (приложена).

При помощи Bulk Load пытаюсь создать в базе таблицы.

Таблицы, ключи создаются. Но! Все поля имеют тип "nvarchar(40)".

Просьба к специалистом по данной теме посмотреть мою схему. Что я делаю не так?

Если уменьшить количество элементов, то все встает на свои места. Типы создаются как указано в XSD?

Может это глюк Bulk Load? Может там есть ограничения на количество вложенных уровней и количество таблиц?

Файл схемы


Зара6oток от 20000 рy6лей в день!!! Вам нужен готовый, уже настроенный метод зара6oтка?

$
0
0
Зара6oток от 20000 рy6лей в день!!!

Вам нужен готовый, уже настроенный метод зара6oтка?
- Без сложных курсов, в которых вы не можете разo6раться.
- Без рутинной ра6оты.
- Без обмана и чтобы деньги были дoстойные.
Именно готoвый зара6оток, а не 6еспoлезный курс!
Пoдро6ности на -> http://blagodelo.info (blagodelo.info)

Использовать процедуру или нет для импорта данных

$
0
0
Я хотела записать как процедуру в SQL, но не дает, говорит что нельзя.
Не могли бы ли вы мне подсказать, как мне поступить, чтобы эти команды выполнились бы при запуске?

CREATE PROCEDURE [dbo].[import_csv_to_SQL]
USE [IMPORTDAT]
GO
DELETE FROM csv1
BULK INSERT csv1 FROM 'D:\DDD\csv1.csv'
   WITH (
      FIELDTERMINATOR = ',',
      ROWTERMINATOR = '\n'
);
GO

Наличие значения в столбце во всех таблицах

$
0
0
Подскажите, есть БД, в таблицах есть столбец Guid, раньше его не заполняли, теперь заполняют, каким запросом можно проверить заполненность Guid во всех таблицах?

Написать запрос

$
0
0
Всем привет! Помогите пожалуйста решить такое задание

На основе данных вывести таблицу остатков на счетах на конец текущего месяца и на конец каждого из пяти предыдущих.

В ko представлены 4 контрагента 'Север', 'Запад', 'Восток', 'Юг'
id - id контрагента
name - название контрагента

В ac представлены движения средств на счетах:
ko - id контрагента из представления ko
oper_date - дата операции
amount - сумма
direction - направление движения средств (1 - поступление, 0 - снятие)

Дописать запрос, для получения результата
[img=Безымянный.png]

with
ko as
(
select 1 id, 'Север' name union all
select 2 id, 'Запад' name union all
select 3 id, 'Восток' name union all
select 4 id, 'Юг' name
),
ac as
(
select 1 ko, convert(datetime, '01.01.2017', 104) oper_date, 100 amount, 1 direction union all
select 1 ko, convert(datetime, '11.01.2017', 104) oper_date, 30 amount, 0 direction union all
select 1 ko, convert(datetime, '01.02.2017', 104) oper_date, 230 amount, 1 direction union all
select 1 ko, convert(datetime, '11.02.2017', 104) oper_date, 40 amount, 0 direction union all
select 1 ko, convert(datetime, '01.03.2017', 104) oper_date, 90 amount, 1 direction union all
select 1 ko, convert(datetime, '11.03.2017', 104) oper_date, 180 amount, 0 direction union all
select 1 ko, convert(datetime, '01.04.2017', 104) oper_date, 400 amount, 1 direction union all
select 1 ko, convert(datetime, '11.04.2017', 104) oper_date, 100 amount, 0 direction union all
select 1 ko, convert(datetime, '01.05.2017', 104) oper_date, 120 amount, 1 direction union all
select 1 ko, convert(datetime, '11.05.2017', 104) oper_date, 310 amount, 0 direction union all
select 1 ko, convert(datetime, '01.06.2017', 104) oper_date, 100 amount, 1 direction union all
select 1 ko, convert(datetime, '11.06.2017', 104) oper_date, 40 amount, 0 direction union all
select 1 ko, convert(datetime, '01.07.2017', 104) oper_date, 90 amount, 1 direction union all
select 1 ko, convert(datetime, '11.07.2017', 104) oper_date, 180 amount, 0 direction union all
select 1 ko, convert(datetime, '01.08.2017', 104) oper_date, 400 amount, 1 direction union all
select 1 ko, convert(datetime, '11.08.2017', 104) oper_date, 100 amount, 0 direction union all
select 1 ko, convert(datetime, '01.09.2017', 104) oper_date, 120 amount, 1 direction
union all
select 2 ko, convert(datetime, '01.02.2017', 104) oper_date, 725 amount, 1 direction union all
select 2 ko, convert(datetime, '11.02.2017', 104) oper_date, 40 amount, 0 direction union all
select 2 ko, convert(datetime, '01.03.2017', 104) oper_date, 90 amount, 1 direction union all
select 2 ko, convert(datetime, '11.03.2017', 104) oper_date, 180 amount, 0 direction union all
select 2 ko, convert(datetime, '01.04.2017', 104) oper_date, 100 amount, 1 direction union all
select 2 ko, convert(datetime, '11.04.2017', 104) oper_date, 380 amount, 0 direction union all
select 2 ko, convert(datetime, '01.05.2017', 104) oper_date, 120 amount, 1 direction union all
select 2 ko, convert(datetime, '11.05.2017', 104) oper_date, 480 amount, 0 direction union all
select 2 ko, convert(datetime, '01.06.2017', 104) oper_date, 80 amount, 1 direction
union all
select 3 ko, convert(datetime, '01.01.2017', 104) oper_date, 125 amount, 1 direction union all
select 3 ko, convert(datetime, '11.02.2017', 104) oper_date, 40 amount, 0 direction union all
select 3 ko, convert(datetime, '01.03.2017', 104) oper_date, 90 amount, 1 direction union all
select 3 ko, convert(datetime, '11.03.2017', 104) oper_date, 180 amount, 0 direction union all
select 3 ko, convert(datetime, '01.06.2017', 104) oper_date, 100 amount, 1 direction union all
select 3 ko, convert(datetime, '11.06.2017', 104) oper_date, 80 amount, 0 direction union all
select 3 ko, convert(datetime, '01.08.2017', 104) oper_date, 120 amount, 1 direction union all
select 3 ko, convert(datetime, '11.08.2017', 104) oper_date, 10 amount, 0 direction union all
select 3 ko, convert(datetime, '01.09.2017', 104) oper_date, 80 amount, 1 direction
union all
select 4 ko, convert(datetime, '01.02.2017', 104) oper_date, 90 amount, 0 direction union all
select 4 ko, convert(datetime, '11.02.2017', 104) oper_date, 180 amount, 1 direction union all
select 4 ko, convert(datetime, '01.05.2017', 104) oper_date, 100 amount, 0 direction union all
select 4 ko, convert(datetime, '01.08.2017', 104) oper_date, 120 amount, 1 direction union all
select 4 ko, convert(datetime, '11.08.2017', 104) oper_date, 480 amount, 1 direction union all
select 4 ko, convert(datetime, '01.09.2017', 104) oper_date, 80 amount, 1 direction
)

Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.

$
0
0
Всем привет!
Версия SQL:

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
Aug 15 2017 10:23:29
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

Есть многопользовательская OLTP система. Часто возникают конфликты транзакций.
Текст примерно такой: "Транзакция (идентификатор процесса XXX) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно."

Скорее всего это из-за того, что я не правильно понимаю как работают транзакции в хранимых процедурах, по этому SQL в хранимках пишу не правильно.

Соответственно вопрос :) - Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.

Блокировки появляются в "сложных" хранимках, где есть несколько update. Ниже я привёл три примера. Первый пример - как есть сейчас. Остальные, наверное, как должно быть.
Обёртку в транзакции я сделал не для того, чтобы сохранялась целостность операции, а для того чтобы избежать блокировок. Возможно я ошибаюсь, подскажите как правильно?

Пример 1
CREATE PROCEDURE myProc
AS
BEGIN
 -- без явного указания транзакций
 SET NOCOUNT ON;

 update myTable set 
  f1 = 1
 where f2 = 1

 update myTable set 
  f1 = 2
 where f2 = 2

 update myTable set 
  f1 = 3
 where f2 = 3

END


Пример 2
CREATE PROCEDURE myProc
AS
BEGIN
 -- одна транзакция на всю процедуру
 SET NOCOUNT ON;
 
 begin tran 

  update myTable set 
   f1 = 1
  where f2 = 1

  update myTable set 
   f1 = 2
  where f2 = 2

  update myTable set 
   f1 = 3
  where f2 = 3
 
 commit

END


Пример 3
CREATE PROCEDURE myProc
AS
BEGIN
 -- отдельная транзакция для каждого update
 SET NOCOUNT ON;

 begin tran 
  update myTable set 
   f1 = 1
  where f2 = 1
 commit

 begin tran
  update myTable set 
   f1 = 2
  where f2 = 2
 commit

 begin tran
  update myTable set 
   f1 = 3
  where f2 = 3
 commit

END

Помогите плз разобраться с проблемой производительности.

$
0
0
День добрый!
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
Jun 17 2016 19:14:09
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

На сервере одна база OLTP в FULL Recovery Model размером порядка 300Гб


Некоторое время появились проблемы с производительностью, элементарные вещи(например инсерт одной строки), которы обычно занимают милисекунды иногда подвисают и могут продолжаться около 30 секунд.
Анализирую трейс, вижу, что все как-будто подвисает на минуты две, а потом, с аналогичной активностью все работает нормально.

Сделал неболшую кореляцию между имеющимися данными и обратил внимание на следующее:
Каждые 20 минут происходит резервное копирование журнала транзакций средствами Veeam, каждый бекап длится несколько секунд и занимает порядка 1Гб в среднем
Я обратил внимание, что во время бекапа и после него подозрительно растет счетчик Pages/Sec пиками по несколько минут.
"Зависания" происходет чаще всего именно в эти пики.

Хотел бы узнать может ли быть связь между бекапами и зависаниями?
На что еще стоит обратить внимание?
Приложил график Pages/Sec, бэкабы запусакеются в 00,20 и 40 минут

Картинка с другого сайта.


Спасибо!

Сервер требует грант на выборку, хотя есть грант на выполнение

$
0
0
Добрый день, коллеги.

Столкнулся с ситуацией. После переноса бд (путем бекап-ресторе) как то странно (спорадически) перестают работать гранты на процедуры. Схема такая: пользователь включен в группу, группе выданы права на выполнение хранимки. На исходной базе всё прекрасно работает, на восстановленной сервер вдруг начинает требовать права на выборку из таблиц. Пока не выдашь гранты на все таблицы - не успокаивается. Динамических запросов с этими таблицами нет. Буду благодарен за любую подсказку куда смотреть.

Проблема с CPU в SP

$
0
0
Есть хранимая процедура, вызывается порядка 500 раз в минуту.
avg cpu time = 200-300 миллисекунд.
Когда SP начинает вызываться 2000-3000 раз в минуту периодически (но не всегда) avg cpu time становится 2000-3000 миллисекунд.
Т.е. процессор при каждом вызове SP начинает потребляться в 10 раз больше.
План выполнения SP не меняется.
Кол-во строк немного меняется.
Проблемный statement внутри этой SP: insert into @TempTable ... join штук 15 больших таблиц
План выполнения statement не меняется.
Кол-во строк в statement немного меняется.
На SQL Server 2012 такой проблемы не было.
Проблема проявилась после перехода на SQL Server 2016. Обновление до SQL Server 2016 SP2 проблему не решило.
В плане параллелизм не используется.
Пробовал ставить maxdop = 1 на сервере, всё равно периодически cpu time прыгает с 200-300 миллисекунд до 2000-3000 миллисекунд.
Когда SP выполняется долго иногда помогает перекомпиляция SP, иногда помогает изменение sp_configure 'max degree of parallelism', иногда ничего не помогает и проблема проходит сама когда вызовов SP становится немного.
Что можно попробовать сделать? Что проверить?

версия: Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64) Mar 18 2018 09:11:49 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: )

возможна ли оптимизация Self-Join по ключу

$
0
0
Есть табличные инлайн-функции, которые принимают в параметре дату актуальности и возвращают данные из основной таблицы и соединенных с ней таблиц с периодиками (первичный ключ = первичный ключ основной таблиц + дата).
В общем суть в том, что обращаясь к такой функции и указывая дату мы получаем все необходимые столбцы, не задумываясь о том где именно они хранятся - в основной таблице или периодиках. Довольно удобно и универсально, поскольку не нужно изменять кучу кода в случае если какой-то из столбов станет или не станет периодическим. Нужно будет поправить, только одну функцию.

Иногда возникает необходимость запросить кроме актуальных данных еще и данные из столбца на дату, которая находилась в прошлом. В таком случае приходится делать соединение по первичному ключу (pk_id) этих 2х функций с разными параметрами:
SELECT T1.*, T2.c5
FROM            tabe_inline_func(@date1) AS T1
LEFT OUTER JOIN tabe_inline_func(@date2) AS T2  ON T2.pk_id = T1.pk_id

В плане запроса получается Self-Join основной таблицы самой с собой по первичному ключу. Т.е. если убрать все лишнее получается запрос:
SELECT T1.*, T2.c5
FROM            common_table AS T1
LEFT OUTER JOIN common_table AS T2  ON T2.pk_id = T1.pk_id

Вопрос: неужели sql server не может понять, что в таком запросе осуществляется соединение строки самой с собой и т.о. план запроса можно упростить до примерно такого:
SELECT T1.*, T1.c5
FROM            common_table AS T1

Может быть можно как-то явно указать на необходимость оптимизации?

Избавиться от такого двойного запроса к таблице можно убрав из функции основную таблицу и оставив только периодики, которые будут соединяться по параметру:
SELECT T1.*, T2.c5
FROM       common_table                       AS T1
OUTER JOIN tabe_inline_func(T1.pk_id, @date2) AS T2

Однако при такой схеме мы теряем универсальность запроса и получаем необходимость исправлять каждый раз весь подобный код при смене конфигурации периодик (перемещение столбца в/из периодику).

Получается выбор между универсальностью кода и неоптимальность запросов.
Можно ли как-то избежать компромисса?

SQL-запрос. Вопрос по рекурсии

$
0
0
Здравствуйте!

Есть SQL-запрос, который для каждого ТТ+SKU обращается к предыдущему значению с помощью рекурсии.
+SQL-запрос
DECLARE @Таблица table(		
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Отгрузка] integer,	
	[ID] INTEGER)	
;

INSERT INTO
  @Таблица
VALUES 
('Код ТТ1','SKU1', '01.01.2014', 100, 1),
('Код ТТ1','SKU1', '02.01.2014', 110, 2),
('Код ТТ1','SKU1', '03.02.2014', 120, 3),
('Код ТТ1','SKU1', '04.02.2014', 130, 4),
('Код ТТ1','SKU2', '01.02.2014', 100, 1),
('Код ТТ1','SKU2', '02.02.2014', 110, 2),
('Код ТТ1','SKU2', '03.03.2014', 120, 3),
('Код ТТ1','SKU2', '04.03.2014', 130, 4)
;
WITH
	cte AS (
		SELECT
			*,			
			[Предыдущая отгрузка]=cast(null as integer)
		FROM
			@Таблица
		WHERE
			[ID]  = 1			
	UNION ALL	
		SELECT
			Таб.*,			
			cte.[Отгрузка]	
		FROM
			@Таблица Таб
		inner join
			cte
		ON
			Таб.[ID] = cte.[ID] + 1	
			AND 
			Таб.[Код ТТ] = cte.[Код ТТ]
			AND 
			Таб.[Код продукции] = cte.[Код продукции]
	)

SELECT
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузка]	
	[ID],
	[Предыдущая отгрузка]
FROM
	cte
ORDER BY	
	[Код ТТ],
	[Код продукции],
	[ID]

1. Добавляю поле [Предыдущая отгрузка]. Скажите, почему не отображается поле отгрузка?
2. Как сделать так, чтобы для каждого ТТ+SKU
- отбирались с ID = 1, если это не январь
- отбирались с ID = 2, если при ID=1 это январь.

Результат должен быть таким
Код ТТ Код продукции Дата Отгрузка IDПредыдущая отгрузка
Код ТТ1 SKU1 2014-01-01 100 1NULL
Код ТТ1 SKU1 2014-01-02 110 2NULL
Код ТТ1 SKU1 2014-02-03 120 3110
Код ТТ1 SKU1 2014-02-04 130 4120
Код ТТ1 SKU2 2014-02-01 100 1NULL
Код ТТ1 SKU2 2014-02-02 110 2100
Код ТТ1 SKU2 2014-03-03 120 3110
Код ТТ1 SKU2 2014-03-04 130 4120

Помогите вытащить значение из XML

$
0
0
Приветствую.

Есть XML -ка.
DECLARE @xmlData XML ='<?xml version="1.0" encoding="windows-1251" standalone="no"?> 
<messages mes="1" mes_number="108">     
<mesParam>         
<number>7</number>
</mesParam> 
</messages>';



Из которой надо вытащить запросом значение 7 , т.е "number".

И никак не получается это сделать, мучаюсь уже час

Вот так по идее должно работать, но возвращает NULL:

SELECT r.value('@number[1]', 'int') as Id
FROM @xmlData.nodes('/messages/mesParam') as col(r)





При этом, mes_number, например, достается без труда:

SELECT r.value('@mes_number[1]', 'int') as Id
FROM @xmlData.nodes('/messages') as col(r)



Подскажите пожалуйста, как достать поле number из данного XML?

Непонятки при переводе строки в дату (несоответствие заявленным форматам)

$
0
0
Приветствую.

Накнулся сейчас на проблему.

Надо преобразовать строку с сегодняшней датой '030518' в дату.


Смотрю опции CONVERT

https://msdn.microsoft.com/ru-ru/library/ms187928(v=sql.120)


6 = дд мес гг


Т.е. 6-й формат должен подойти.


НО!!!

SELECT CONVERT(date, '030518', 6);

--показывает:
2003-05-18






Подскажите пожалуйста, как преобразовать строку '030518' в дату по формату дд мес гг ?
Viewing all 7251 articles
Browse latest View live