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

Операция сортировки при группировании данных

$
0
0
Здравствуйте, помогите пожалуйста разобраться с запросом
SELECT cast(cast( Cast([date_tt] as datetime)-datepart(weekday, Cast([date_tt] as datetime))+1 as date)as datetime) as Period,
	DTT.id_tt
	,DTT.id_tov
	,SUM([post]) post
	,SUM([digust]) digust
	,SUM(([spisanie] + [spisanie_dost])*[price]) spisanie
	,SUM([spisanie_kach]*[price]) spisanie_kach
	,SUM([boi]) boi
	,SUM([akcia]) akcia
	,SUM([razniza]) razniza
	,SUM([razniza]) raznizaRaschet
	,SUM([summa]) summa
	,SUM([quantity]) rashod
 	,SUM([quantity]) rashodKKM
	,SUM([vozvrat_pok]) vozvrat_pok
	,SUM([peremPlus]) polucheno
	,SUM([peremMinus]) peremesheno
	,SUM([complect]) complect
	,SUM([discount50]) discount50
	,Avg([price]) price
FROM [vv03].[dbo].[DTT] DTT (nolock) 

where date_tt >= '2017-11-13' and date_tt <= '2017-12-10'
			
GROUP BY 
	 DTT.id_tt, DTT.id_tov , cast(cast( Cast([date_tt] as datetime)-datepart(weekday, Cast([date_tt] as datetime))+1 as date)as datetime)


в плане запроса показывает операцию сортировки с желтым воскл знаком (предупреждение), подскажите плиз, как можно оптимизировать данный запрос? запрос выдает 2198086 строк

Элементарный запрос помогите чайнику.

$
0
0
Я не работаю с SQL Server, поэтому прошу снисхождения. :)
Встала производственная необходимость сделать хранимку к сторонней БД.
И прошу пояснить почему происходит следующая ситуация.
Пример.

num number;
num:=22;
begin

select "CardNum", "CardID" 
into CNum,CId
from dbo.Card@WinBD
where "CardNum" = 22;

end; 

Если в запросе стоит 22 причем без кавычек все работает. Если вместо 22 я ставлю переменную описанную выше num, то не работает. Вопрос почему?
Поле nvarchar(30).
Тип для 22 задавала nvarchar(30) так же не работает.

Проблемы с базой SQL

$
0
0
При попытке подключения базы к Microsoft SQL Management Studio выдает следующую ошибку. Возможно ли как-то восстановить базу?

Даунгрейд базы 2014 --> 2005

$
0
0
Необходимо сделать даунгрейд БД c MS SQL 2014 --> MS SQL 2005
При попытке отсоединить / присоединить пишет :


the database cannot be opened because it is version 782

При попытке восстановитьбэкап пишет :


TITLE: Microsoft SQL Server Management Studio
------------------------------

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------
ADDITIONAL INFORMATION:

The media family on device 'D:\SQL_DATA\msk_12_12_2017.bak' is incorrectly formed. SQL Server cannot process this media family.
RESTORE HEADERONLY is terminating abnormally. (Microsoft SQL Server, Error: 3241)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft SQL Server&ProdVer=09.00.1399&EvtSrc=MSSQLServer&EvtID=3241&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------

Не получается создать линкованный сервер PostgreSQL

$
0
0
На ноуте с Win 8.1 x64 стоит мс скл 2005
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 6.2 (Build 9200: )
и PostgreSQL 9.6 x64.
Пытаюсь прилинковать Постгре, все делал последовательно, как в ссылке
https://www.mssqltips.com/sqlservertip/3662/sql-server-and-postgresql-linked-server-configuration--part-2/

--установил ОДБЦ драйвер постгре
--создал системный ДСН

и на этапе настройки линкованного сервера получаю ошибку

Не удалось проинициализировать объект источника данных поставщика OLE DB "MSDASQL" для связанного сервера "PG_PRO_9_6".
Поставщик OLE DB "MSDASQL" для связанного сервера "PG_PRO_9_6" вернул сообщение "[Microsoft][Диспетчер драйверов ODBC] В указанном DSN архитектура драйвера и архитектура приложения не соответствуют друг другу.". (Microsoft SQL Server, ошибка: 7303)

Это значит всё, конец? Нужно MS SQL Server x64 ставить?
Как быть?!

Репликация Oracle - MSSQL

$
0
0
Доброго времени суток! Вопрос знатокам. Какими средствами лучше организовать постоянную репликацию/выгрузку данных из таблицы oracle в mssql. Сейчас эта задача реализуется прямым запросом используя драйвер Oracle in instantclient_11_2. Интересует как вообще реализуют задачи постоянной загрузки из таблиц других СУБД в MSSQL. SSIS? Связанный сервер? Или лучше вынести функционал этого обмена на СУБД источник данных(в моем случае Oracle)? Объем данных для загрузки огромный, поэтому в приоритете вариант с наименьшей скоростью загрузки. Будет ли вообще ощутимый прирост скорости относительно текущей реализации?
P.S. MSSQL 2014 Enterprise

Как ускорить иморт данных?

$
0
0
Есть SSIS-Пакет, который тянет данные с Оракла. Самая большая таблица имеет около 80 млн. записей и занимает порядка 50 ГБ на диске. Только ее импорт занимает 12 часов. Насколько это (в среднем) медленно или быстро?
Можно ли этот процесс как-то ускорить, изменив настройки БД, таблиц или файлов дб?
Я проверил, индексов в таблицах нет.
Настройки БД - стандартно правильные: RECOVERY model FULL; Auto close FALSE; Auto shrink FALSE и т.д.

Перед импортом все данные удаляются TRUNCATE. Log-file ограничен 2GB (не мало?), автоинкремент 1024Мб.

SELECT @@VERSION
Microsoft SQL Server 2014 (SP2-CU4) (KB4010394) - 12.0.5540.0 (X64) Jan 27 2017 03:40:25 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Спасибо!

Вопросы безопасности при размещении SQL Server на хостинге

$
0
0
Добрый день!

MS SQL Server Express
Хостинг: VPS c Windows Server с внешним IP-адресом.
Планирую установить MS SQL на VPS, чтобы моя программа, написанная мною на C#, могла удаленно подключаться к БД на SQL Server.

Проконсультируйте пожалуйста по следующим вопросам:

1) Чем то отличается строка подключения к Локальной СУБД и Размещенной на хостинге? Если да, то чем (кроме IP-адреса сервера конечно)?

2) По какому протоколу следует устанавливать соединение и по какому порту?

3) Безопасно ли открывать порт в брендмауэре для клиентских подключений?

4) Маппинг портов если требуется, то как именно?

Разноска суммы. Нарастающий итог.

$
0
0
Всем привет.
Раньше вроде бы такие задачи легко решал, но ,видимо, годы дают о себе знать :)
Нужно сумму разнести на строки. В строках есть как и положительное так и отрицательные суммы.
Результатом должны быть строки с рассчитанным количеством для каждой строки. Рассчитанное кол-во может быть меньше исходной суммы в строке - главное чтобы общая сумма по строкам не превышало заявленной разносимой суммы.
Есть еще один нюанс - в результат должны попасть только те платежи, чья сумма в периоде больше 0. Если же сумма по периоду меньше нуля - то она должна уменьшить сумму предыдущего периода или последующего (без разницы) с пересчитанным количеством в этих периодах.
Желательно все это сделать красиво - одним запросом :).
DECLARE @N_Sum FLOAT = 7.3  -- сумма для разнесения

;WITH t (ID,N_SUM,d_post_date,n_period) AS 
	(
		SELECT  1 ID,		-- PK
				2 N_SUM,	-- сумма
				CONVERT(SMALLDATETIME,'20171001') d_post_date, --  дата
				201710 n_period   -- период (для упрощения)
		UNION ALL
		SELECT 2 , 1 N_SUM, CONVERT(SMALLDATETIME,'20171002') d_post_date,201710 n_period
		UNION ALL
		SELECT 3 ,  3 N_SUM, CONVERT(SMALLDATETIME,'20171102') d_post_date,201711 n_period
		UNION ALL
		SELECT 5 ,  -4 N_SUM, CONVERT(SMALLDATETIME,'20171103') d_post_date,201711 n_period
		UNION ALL
		SELECT 4 , 5 N_SUM, CONVERT(SMALLDATETIME,'20171203') d_post_date,201712 n_period
		UNION ALL
		SELECT 6 LINK, 1 N_SUM, CONVERT(SMALLDATETIME,'20171204') d_post_date,201712 n_period
	
	)
	SELECT	t.*,
			CASE	WHEN t.sum_by_step < t.n_need AND t.sum_by_step <= sum_by_period  THEN t.N_SUM 
					WHEN t.sum_by_step < t.n_need AND t.sum_by_step > sum_by_period  THEN t.sum_period 
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM >= t.n_need AND t.n_need <= t.sum_period THEN t.n_need
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM >= t.n_need AND t.n_need > t.sum_period THEN t.sum_period
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM < t.n_need  and t.N_SUM <= t.sum_period THEN  t.N_SUM
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM < t.n_need  and t.N_SUM > t.sum_period THEN  t.sum_period
			END   n_quant
	FROM (
			SELECT	T.*,
					@N_Sum - ISNULL(LAG(t.sum_by_step) OVER (ORDER BY d_post_date,N_SUM DESC ,ID),0) n_need  -- необходимое кол-во
			FROM  (
				SELECT	*,
						SUM(N_SUM) OVER (ORDER BY d_post_date,N_SUM DESC ,ID)			sum_by_step, -- нарастающий итог
						SUM(N_SUM) OVER (ORDER BY n_period )							sum_by_period, -- нарастающий итог в пределах периода
						SUM(N_SUM) OVER (PARTITION BY n_period ORDER BY n_period)		sum_period -- сумма по периоду
				
				FROM T
				WHERE N_SUM <> 0
				) t	
			WHERE t.sum_period > 0	
		) t

Но мой вариант кривоват так как не правильно анализируется отрицательный остаток в периоде.
Спасибо.

Получения года

$
0
0
Подскажите можно в таблице получить полностью 2018 год?

Через какие функции можно это сделать?

MS SQL cъедает больше памяти, чем ему положено.

$
0
0
Всем добрый день.

Перебрались недавно на новые сервера.
На двух из них уже несколько раз выскакивала ошибка: There is insufficient system memory in resource pool 'internal' to run this query.
И сервер отъедает памяти больше, чем установлено в настройках.
Про саму ошибку я почитал:
1) Не выставлено ограничение max server memory
2) Баг версии сервера, исправляется нужным обновлением.

Суть в том, что:
а) ограничение max server memory стоит: на главном 20 из 24гб, на двух других 4 и 4.5 из 6гб. На серверах, кроме MS SQL ничего не крутится. После настроек сервера были перегружены.
б) сервера обновлены до sp3. Сисадмин утверждает, что нужный апдейт входит в установленные сервис паки.

Единственное отличие от старых серверов, где подобных проблем не было, что те были sp2.

Версия сервера: Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Два второстепенных сервера уже пришлось экстренно перегружать из-за того, что MS SQL съел больше памяти, чем ему положено. Но это было не критично.
А вот остановка основного сервера критична днем даже на 5минут. Там просто памяти больше 20, но он уже сожрал 21 с копейками.

Я уже и не знаю, куда копать. Это таки бага верчсии\сервис пака, или мы что-то недонастроили в дб сервере?
---
Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с)

Группировка по диапазонам времени

$
0
0
Добрый день!
Существует таблица с фактами нахождения отдельных вагонов в различных городах:
Table VAGON_DESTINATION
(ID int, -- Идентификатор записи
VAGON_ID, Идентификатор вагона
REGION ID int, -- Идентификатор региона
DateAndTime DateTime, --дата время записи
)
Как сгруппировать даты пребывание вагонов в различных городах по неразрывным интервалам времени, например:
VAGON_ID РЕГИОН ИНТЕРВАЛ
16 32 01.01.2017 10:22:30 - 02.01.2017 22:16:10
16 32 04.07.2017 06:21:00 - 09.07.2017 12:43:11
16 36 02.08.2017 04:13:18 - 05.08.2017 23:52:00
16 32 16.08.2017 10:25:30 - 18.08.2017 22:17:10

Я пытаюсь написать что-то типа этого
SELECT VAGON_ID
,REGION_ID
,MIN(DateAndTime)
,MAX(DateAndTime)
FROM VAGON_DESTINATION
WHERE VAGON_ID=16
GROUP BY REGION_ID

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

SELECT несколько значений в одну колонку

$
0
0
Добрый день всем!

Подскажите, можно ли выбрать значения из фиксированного списка в одну колонку?
Как выбрать в несколько колонок я знаю:
SELECT 1, 2, 3, 4, 5, 6...

а как получить результат в одной колонке?
1
2
3
4
5
6

Загадка массовой загрузки XML

$
0
0
Грузится xml через sqlXmlBulkLoad в табличку базы tempdb
[src]
CREATE TABLE [dbo].[pricesServiceSetsPriceDates](
[gross] [real] NULL,
[ids] [nvarchar](4000) NOT NULL,
[version] [nvarchar](8) NULL,
[OverflowColumn] [ntext] NULL,
[spoKey] [int] NULL DEFAULT ((-1)),
[hash] [int] NULL,
[key] [int] NOT NULL,
[from] [date] NULL,
[to] [date] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
[src]
индексов нет.
В столбце [OverflowColumn] везде NULL.
Столбец [ids] заполнен строками длиной < 900 символов, реально в среднем около 100 символов.

Но sp_spaceused выдает чудовищную картину.

name rows reserved data index_size unused
pricesServiceSetsPriceDates 1187065 75972400 KB 9496520 KB 240 KB 66475640 KB

Куда и зачем оно хавает такую чортову прорву пустого места?
Data = 9 496 520 KB
!!!
unused = 66 475 640 KB!!!

Триггер!!!

$
0
0
Здраствуйте. Нужна помощь:
мне нужно написать триггер, который запретит удаление из финансовых таблиц базы данных.
нужно запретить удаление записей из таблицы Payments, статус которых равен (утвержден)
Буду очень благодарен

Про аудит SQL

$
0
0
Уважаемые коллеги!
Никто не знает, есть ли аудит в версии
Microsoft SQL Server 2014 (SP2-GDR) (KB3194714) - 12.0.5203.0 (X64) Sep 23 2016 18:13:56
Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Благодарю заранее за комментарии! )

оптимизация запроса

$
0
0
Прошу помощи:
adp проект, Форма содержит ленточную подформу, источник записи - функция (записей порядка 28000 на сегодня).
При загрузки формы проходит около 1 минуты, прежде же загрузятся данные.
Декомпиляция, изменение источника записей, уменьшение сортировочных полей, до одного не решило мою проблему. Единственное, что помогло, это - отказаться от сортировки. Это не вариант, поскольку поле по которому идет сортировка отображает deadline, это вычисляемое поле в запросе DaysToEventEndNewSort.
Можно ли как то увеличить скорость загрузки?
Спасибо.

Ниже запрос и план запроса.

Отправка SNMP traps по ошибкам

$
0
0
Добрый день, все!

Никогда такого не было, и вот опять...!
Отдел эксплуатации запросил, чтобы MS SQL 2014 и 2016 - отправлял им SNMP Traps, по ошибкам работы Jobs и другим. Отсылки на MS Docs с описчанием, что MS прекратил поддержку SNMP с SQL 2005 - успехом не увенчались. Трапы им подавай...

Какие варианты обойтись малой кровью? Сам вижу следующие:
1. Написать powershell скрипты, которые в конце job проверяют его статус и отправляют SNMP.
2. ???

Буду признателен за идеи.

Проектирование таблиц

$
0
0
Добрый день! Возникла проблема. Есть таблицы "Вопросы", "Преподаватели" и "Студенты". Сейчас в качестве докладчика вопроса выступает только преподаватель т.е. в "Вопросы" IDДокладчик = IDПреподаватель. Появилась необходимость чтобы студент тоже мог быть докладчиком (т.е. либо студент либо преподаватель). Каким образом можно грамотно изменить структуру "Вопросы" в таком случае? Идентификаторы использую обычные. Не GUID. Спасибо!

Помогите сформулировать проблему для DBA

$
0
0
Коллеги,

Имею приложение, которое забирает данные из таблиц MS SQL, преобразует их и вставляет в Berkley DB.
Данных много, один акт переноса занимает ~3 часа.
Само приложение черный ящик, по его куцым логам невозможно понять какая операция заняла сколько времени.
Хотелось бы понимать, на что тратится время.

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

Помогите, плз., сформулировать задание для DBA.

Спасибо!
Viewing all 7251 articles
Browse latest View live