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

Размеры дисков сервера

$
0
0
xp_fixeddrives не возвращает размеры дисков сервера, а иногда их все же требуется знать, причем включать поддержку скриптов/clr нельзя.

В итоге сегодня набросал процедуру приведенную ниже. Она вернет размеры всех дисков, на которых есть базы данных. Если на диске нет баз, но есть папка DATA или LOGS, то процедура создаст в них пустую базу данных, чтобы место все же определялось...

В общем, желающие могут пробовать.

CREATE PROCEDURE GetDisks(@Drv char(1) = NULL)
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @f tinyint = 0, @db sysname, @DefaultLogFolder sysname
	DECLARE @Sql nvarchar(MAX)
	
	DECLARE @Disks TABLE (Drv char(1), Total_MB int, Free_MB int, [Data] bit DEFAULT 0, Logs bit DEFAULT 0)
	DECLARE @Folders TABLE (Folder sysname)

	EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLogFolder OUTPUT
	INSERT INTO @Disks (Drv, Free_MB) EXEC master..xp_fixeddrives
	IF NOT @Drv IS NULL
		DELETE FROM @Disks WHERE Drv <> @Drv

	UPDATE @Disks
		SET Total_MB = t.total_bytes / 1048576
		FROM @Disks d
			INNER JOIN(SELECT DISTINCT UPPER(LEFT(volume_mount_point,1)) AS Drv, total_bytes
						FROM sys.master_files f
							CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.file_id)) t ON d.Drv = t.Drv

	DECLARE cur CURSOR FOR SELECT Drv FROM @Disks
	OPEN cur
	FETCH NEXT FROM cur INTO @Drv
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @f = 0
		DELETE FROM @Folders

		INSERT INTO @Folders EXEC('EXEC master..xp_subdirs ''' + @Drv + ':\''')

		IF EXISTS(SELECT * FROM @Folders WHERE Folder='DATA')
			BEGIN
				SET @f = 1
				UPDATE @Disks SET [Data] = 1 WHERE Drv = @Drv
			END

		IF EXISTS(SELECT * FROM @Folders WHERE Folder='LOGS')
			BEGIN
				IF @f = 0 SET @f = 2
				UPDATE @Disks SET [Logs] = 1 WHERE Drv = @Drv
			END
		
		IF @f > 0 AND EXISTS(SELECT * FROM @Disks WHERE Drv = @Drv AND Total_MB IS NULL)
			BEGIN
				SET @db = 'z_disk_' + @Drv
				EXEC ('DROP DATABASE IF EXISTS ' + @db)

				SET @Sql ='
CREATE DATABASE ' + @db + '
	ON ( NAME = ' + @db + '_dat, FILENAME = ''' + @Drv + ':\' + CASE WHEN @f = 1 THEN 'DATA' ELSE 'LOGS' END + '\' + @db + '_dat.mdf'' )
	LOG ON ( NAME = ' + @db + '_log, FILENAME = ''' + @DefaultLogFolder + '\' + @db + '_log.ldf'' )'
				EXEC ( @Sql)

				UPDATE @Disks
					SET Total_MB = total_bytes / 1048576
					FROM @Disks d
						INNER JOIN  (SELECT UPPER(LEFT(volume_mount_point,1)) AS Drv, total_bytes
										FROM sys.database_files f
										CROSS APPLY sys.dm_os_volume_stats(DB_ID( @db ), f.file_id)) t ON d.Drv=t.Drv 
			END
		FETCH NEXT FROM cur INTO @Drv
	END
	CLOSE cur
	DEALLOCATE cur
	DELETE FROM @Disks WHERE [Data]=0 AND Logs=0 AND Drv <> 'C'
	SET NOCOUNT OFF

	SELECT * FROM @Disks
END

Какие вопросы задаются BI-специалисту?

$
0
0
Вот, спец утверждает, что знает, как построить хранилища данных и BI систему в целом.
На стеке microsoft (именно поэтому вопрос именно в этом разделе).
Какие ему будут задаваться вопросы на собеседовании?

почему не откатывается транзакция?

$
0
0
Вариант с try catch работает, но я думал что без try catch должен произойти окат из за ошибки.
Или я заблуждаюсь?

create table #T1
(
  C1 int identity(1,1), 
  C2 varchar(10)
)

-- исходное состояние со "старыми данными" которые должны быть обновлены
-- в случае ошибки старые данные должны остаться
truncate table #T1; insert #T1(C2) values('a'),('b') 

begin tran T1
  --это удаление не откатывается при возникновении последующей ошибки
  delete #T1 

  --вызываем ошибку:
  insert #T1(C1, C2) values(1,'c'),(2,'d') --> ошибка 544: Cannot insert explicit value for identity column 

commit

--проверка:
select count(*) from #T1 --> 0 удаление не откатилось

Выборка и вставка

$
0
0
Добрый вечер.
Необходима ваша помощь в реализации логики загрузки данных

Есть запрос, который вставляет максимальное значение InDateTime из источника в целевую таблицу. А мне необходимо изменить запос так, чтобы он вставил все отсутствующие значения. На данный момент таблицы выглядят так:

целевая таблица

Date	InDateTime
2019-06-03 00:00:00.000 2019-06-05 09:04:08.027
2019-06-02 00:00:00.000 2019-06-05 09:04:08.027
2019-05-30 00:00:00.000 2019-05-31 12:26:48.013
2019-05-29 00:00:00.000 2019-05-30 13:14:43.857
2019-05-28 00:00:00.000 2019-05-29 13:26:20.957
2019-05-27 00:00:00.000 2019-05-28 13:08:33.013

источник

Date	InDateTime
2019-06-05 00:00:00.000 NULL
2019-06-04 00:00:00.000 NULL
2019-06-03 00:00:00.000 2019-06-05 09:04:08.027
2019-06-02 00:00:00.000 2019-06-05 09:04:08.027
2019-06-01 00:00:00.000 2019-06-05 08:59:23.193
2019-05-31 00:00:00.000 2019-06-04 20:18:12.720
2019-05-30 00:00:00.000 2019-05-31 12:26:48.013
2019-05-29 00:00:00.000 2019-05-30 13:14:43.857
2019-05-28 00:00:00.000 2019-05-29 13:26:20.957
2019-05-27 00:00:00.000 2019-05-28 13:08:33.013

Запрос, который забирает данные из таблицы выглядит так:

DECLARE @GetDate AS datetime
SELECT @GetDate = (SELECT MAX(InDateTime) FROM source)

INSERT INTO target
(
[Date],
InDateTime
)
SELECT s.[Date], s.InDateTime
FROM source s
LEFT JOIN
target t
ON s.InDateTime = t.InDateTime
WHERE s.InDateTime = @GetDate AND t.InDateTime IS NULL


Буду вам благодарен.

Linked Server vs External Table vs OpenQuery vs CLR - параллельность union

$
0
0
Появилась необходимость разнести старые данные по разным серверам
(благо лицензий накопилось достаточно) в архив.

-Linked Server
-External Table
-OpenQuery
-CLR

что из списка позволяет слать параллельные запросы
(получать агрегированные данные с более детальных грануляций) на внешние сервера
в модели представления/view через "select...group.. union all select ... group.." ?

Linked Server по предварительным результатам параллельно не хочет,
там только последовательный план (впрочем и форумы тоже самое говорят).

Какой из перечисленных (или есть что упущенное) позволит собрать
какое-то подобие MPP кластера для оптимизации DWH?

Scale-up возможности сервера уже исчерпали, SQL оптимизации тоже
(индексация, типы, партиционирование и т.д.), осталось Scale-Out но без облаков (и смены платформы)..
У компании есть неиспользуемый резерв чуть более старого железа и лицензий,
идея повысить эффективность без особых вложений через уменьшение бесполезного простоя.
( LoadBalancer/FailOver/Replication/AO/HA/DR не нужны )

Планируемый Control Node - SQL Server 2019 Ent (как раз к сдаче проекта выпустят)

Спасибо за идеи / опытные советы.

Помогите написать запрос

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

Есть таблица, в которой идентификаторы студентов и групп (отношение многие ко многим):
CREATE TABLE [dbo].[student_groups](
group_id int,
student_id int)
Дается список идентификаторов студентов, например:
student_id in (1,2,3,4,5)

Как лучше написать запрос, который покажет все группы, в которых присутствует каждый из этих студентов, то есть группы, где есть все пять вышеперечисленных студентов?

Спасибо.

Help!

$
0
0
Есть таблица истории действий с столбцами:

ИД действия, ИД клиента, Дата действия, Результат.


Как выбрать только те строки, где дата между первым и СЛЕДУЮЩИМ действием > 3 дней (72 часа) в не зависимости от результата?


В таблицу записываются отправка смс. Выборка необходима для отслеживания платежей после рассылки. Берем зазор в 72 часа. Но если по клиенту отправляли смс с периодичностью в 1 день (например попросил реквизиты отправить) то получу дубли по платежам.

Большое значение avg_write_stall_ms у таблицы TempDB

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

Посмотрел у себя параметр avg_write_stall_ms у БД TempDB больше 160ms. В Интернете пишут, что если больше 50ms, то это плохо...
Хотел проконсультироваться, всё же критично такое большое значение?
БД TEMPDB (начальный размер базы 1GB файл журнала 10GB на доп. файлы базу не делил) лежит от отдельной SSD диске
INTEL D3 S4610

СУБД используется для работы с базами 1С около 35-40 пользователей.
ОС: Windows Server 2012 R2
СУБД: MS SQL Server 2008 R2
Сервер 1С на этом же сервере
ОЗУ: 32GB

Ошибка в настройке сайта Master Data Services (MDS)

$
0
0
Не получается развернуть сайт Master Data Services. Прошу вашей помощи, куда копать? Скорее всего ошибка в настройке IIS
Стоит:
1) Microsoft Windows Server 2016 Standart
2) SQL Server 2016

Пишет ошибку.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +142
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +105
   System.Activator.CreateInstance(Type type) +12
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +72

[InvalidOperationException: An error occurred when trying to create a controller of type 'Microsoft.MasterDataServices.WebUI.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +239
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +103
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +285
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +77
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +909
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +195
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +128


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

Можно ли запросом получить значение системных счетчиков?

$
0
0
Можно ли запросом получить значение системных счетчиков?
Не через сохранение в базу и потом считывание а напрямую.
Т.е. нужно в онлайн получать значение загрузки процессора и т.д.

группировка по максимальному дню в каждом месяце

$
0
0
есть таблица как во вложении.
Как из нее без подзапросов выбрать мах дату для каждого месяца?
т.е. должно получиться begin_dt - 2017-01-01,2016-01-02,2019-01-11

если использовать
select max(begin_dt) 


то только макс дату выбирает

Интересное задание по SQL

$
0
0
Нужна помощь

Такое задание
Даны два параметра:
@1
@2

Первый параметр это количество чисел
Второй параметр это число, которое с помощью сумму количества чисел получить это число
Например
@1 - 2
@2 - 8

Результат:
1 7
2 6
3 5
4 4
5 3
6 2
7 1

Нужно написать это с помощью MySQL. Мысль такая у меня создать таблицу, которая в зависимости от первого параметра создаёт новые столбцы и заносит туда сразу значения, которые будут удовлетворять результату(8).Но как это сделать. Помогитее!
Либо
@1 - 4
@2 - 10

1 2 3 4
2 3 4 1
3 ..
...

Заменить символ в строке

$
0
0
Как заменить символ $ в строке на ^, но не заменять, если он в скобках[$]

В случае 1 должен быть заменен, в 2 - не должен

declare @str nvarchar(MAX)
--1 меняет
select @str = N'ealon$'
select @str, REPLACE(@str,'$','^') where @str like '%$%' and @str not like  N'%\[$\]%'

--2 - меняет, а не надо бы
select @str = N'ealon[$]'
select @str, REPLACE(@str,'$','^') where @str like '%$%' and @str not like  N'%\[$\]%'

Принцип оптимистичного параллелизма

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

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


UPDATE e
SET e.price= CAST(dbo.st_Round_price(g.Price_Retail * dbo.st_getrate_now(2))-1 as float) ,
e.price_retail=CAST(g.Price_Retail as float) ,
e.price_swiss= CAST(isnull(g.Price_Old,0) as float)
FROM OPENQUERY(MYSQL_ESPRIT,
'select g_id, price, price_retail, price_swiss from goods') as e
INNER JOIN tbl_Goods as g
ON g.g_id = e.g_id
where g.brand_id = 407 and g.g_id > 1000000


Выводит ошибку:

Поставщик OLE DB "MSDASQL" для связанного сервера "MYSQL_ESPRIT" вернул сообщение "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения.".
Сообщение 7343, уровень 16, состояние 4, строка 4
Поставщик OLE DB "MSDASQL" для связанного сервера "MYSQL_ESPRIT" не может UPDATE таблицу "[MSDASQL]". В наборе строк использовался принцип оптимистичного параллелизма, и значение столбца было изменено после последней выборки или повторной синхронизации содержащей его строки.

Положили этот update в транзакцию, все равно та же ошибка.
Читал до этого форумы, но нет четкого ответа как эту проблему решить.

Спасибо за помощь

Андрей

Запрос с выделением id

$
0
0
Условно, есть таблица, в которой есть 3 поля:
дата, ИД и поинт
Нужно выделить avg() разницы секунд из даты, где первая дата должна иметь поинт 2, а вторая дата должна иметь поинт 1 и ИД равный ИД в первой дате

Расчёт даты возникновения задолженности. T-SQL

$
0
0
Доброе утро!

Просьба помочь решить задачу, уже несколько дней как застрял на ней, просто туплю...
Есть исходная таблица с суммой реализации и оплатами. Нужно на каждый день, за заданный период построить баланс и дату возникновения задолженности если такая была.
Период сгенерировал с 01-01-2019 по 31-03-2019, на каждый день по каждому договору, т.к. потом должно загружаться в BI. Входящие оплаты со знаком "-", реализация со знаком "+".
Поля:
Договор - идентификатор договора
id - уникальный идентификатор оплаты или отгрузки
Дата - дата, когда проводилась реализация или поступила оплата
ДатаВознДЗ - это пример того, какой результат должен быть получен. Нужно найти дату возникновения задолженности (первую не погашенную реализацию).

Имеем несколько входящих операций (до начала расчётного периода с 01-01-2019 по 31-03-2019) - id 1-2-3, которые создают входящую задолженность. После идут обычные операции оплаты и реализации.

Во вложении Excel пример с комментариями как должно быть на выходе (результирующий столбец ДатаВознДЗ).

Смотрел тему http://www.sql.ru/forum/622067/raschet-zadolzhennosti-po-metodu-fifo. Не помогло...

Как пробовал решить:
1. Создавал накопительный итог по каждой строчке, после анализировал его. Если предоплата, то ДатаВознДЗ = 9999-12-31, иначе
Дата реализации. Но такой вариант не учитывает что задолженность образовалась раньше и не показывает именно первую не оплаченную реализацию
2. К п.1 добавил условие что если в предыдущей по дате операции накопительный итог был с задолженностью и с учётом текущей операции задолженность остаётся, то берём ДатаВознДЗ с предыдущего. Но такой вариант опять не работает когда входящая оплата гасит самую старую реализацию.
3. Это уже размышления. Может как-то через последующий обход данных через WHILE ?

Решение ищу на обычном SQL или T-SQL.

SQL помогите с запросом

$
0
0
ДАНО:
ТАБЛИЦА СЧЕТОВ
CounterPartyID INT
PRIMARY KEY IDENTITY [Name] VARCHAR(255) IsActive BIT
1 ИВАНОВ 1
2 ПЕТРОВ 0
3 СИДОРОВ 1
CounterPartyID – ИДЕНТИФИКАТОР СЧЕТА
[Name] – НАЗВАНИЕ СЧЕТА
IsActive – ПРИЗНАК АКТИВНОСТИ

ТАБЛИЦА ПРОВОДОК
TransID INT TransDate DATE RcvID INT SndID INT AssetID INT Quantity NUMERIC(19, 8)
1 01.01.2012 1 2 1 100
2 02.01.2012 1 3 2 150
3 03.01.2012 3 1 1 300
4 04.01.2012 2 1 3 50
TransID – ИДЕНТИФИКАТОР ПРОВОДКИ
TransDate – ДАТА ПРОВЕДЕНИЯ ПРОВОДКИ
RcvID – ИДЕНТИФИКАТОР ПОЛУЧАТЕЛЯ
SndID – ИДЕНТИФИКАТОР ОТПРАВИТЕЛЯ
AssetID – ИДЕНТИФИКАТОР АКТИВА(РУБЛИ, ДОЛЛАРЫ, АКЦИИ ЛУКОЙЛА, АКЦИИ ГАЗПРОМА И Т.Д.)
Quantity – КОЛИЧЕСТВО ПЕРЕДАВАЕМОГО АКТИВА
НУЖНО: ОТОБРАТЬ АКТИВНЫЕ СЧЕТА ПО КОТОРЫМ ЕСТЬ ПРОВОДКИ КАК МИНИМУМ ПО ДВУМ РАЗНЫМ АКТИВАМ.

Отбираю активные счета:
SELECT A.CounterPartyID, A.Name, w.AssetID
FROM dbo.accounts A
JOIN dbo.wirings w ON A.CounterPartyID = w.RcvID
WHERE IsActive = 1
UNION ALL
SELECT A.CounterPartyID, A.Name, w.AssetID
FROM dbo.accounts A
JOIN dbo.wirings w ON A.CounterPartyID = w.SndID
WHERE IsActive = 1

А додуматься до того, как выбрать проводки по двум разным активам не могу.
Помогите

Помогите пожалуйста, MSSQL

$
0
0
Такое задание
Даны два параметра:
@1
@2
Первый параметр это количество чисел
Второй параметр это число, которое с помощью сумму количества чисел получить это число
Например
@1 - 2
@2 - 8
Результат:
1 7
2 6
3 5
4 4
5 3
6 2
7 1
Нужно написать это с помощью MSSQL.
Либо
@1 - 4
@2 - 10
1 2 3 4
2 3 4 1
3 ..
...


ВОТ МОЁ Решение, но оно не практично, так как только для одного случая работает
CREATE DATABASE zadanie
GO 
USE zadanie
CREATE TABLE sum_cyfr(		
id int not null identity,
par1 int not null,
par2 int not null,
res1 int ,
res2 int ,
)
SELECT * FROM sum_cyfr

CREATE PROCEDURE suma
@par1 int,
@par2 int,
@res1 int,
@res2 int
AS 
BEGIN 
	INSERT INTO sum_cyfr([par1],[par2],[res1],[res2])
	VALUES (@par1,@par2,@res1,@res2);
END
EXECUTE suma 2,8,1,7 
EXECUTE suma 2,8,2,6 
EXECUTE suma 2,8,1,7 
EXECUTE suma 2,8,1,10 
SELECT s.res1+s.res2 as suma FROM sum_cyfr s
WHERE s.res1+s.res2 = s.par2
GROUP BY s.res1,s.res2


id	par1	par2	res1	res2
1	2	8	1	7
2	2	8	1	7
3	2	8	1	10
4	2	8	2	6

Результат
suma
8
8
Модератор: Одной темы достаточно

Помогите с оптимизацией запроса, пожалуйста

$
0
0
Логика запроса:
t_A_TaskType - задания на контакты по клиентам в зависимости от статуса (s_id) и источника клиента (i_id_source)
t_A_Agent - клиенты
t_A_Contact - контакты по клиентам
Необходимо выбрать первое по порядку (tt_order) невыполненное задание на контакт (c_taskCompleted != 1) по каждому клиенту.

Вот моя попытка. Запрос возвращает 127 000 записей за 6 секунд. Есть ли возможность существенно сократить это время? Все рекомендованные планом выполнения индексы созданы.

SELECT tt.tt_id, a.a_id, tt.i_id_source, tt.s_id, tt.tt_order, a.u_id, tt.i_id_source2, a.t_id_calltask, tt.i_id_grouping

	FROM dbo.t_A_TaskType AS tt INNER JOIN
	dbo.t_A_Agent AS a ON tt.i_id_source = a.i_id_source AND tt.s_id = a.s_id  
	
	cross apply (select top 1 tt2.tt_id from t_A_TaskType tt2 left join dbo.t_A_Contact AS td ON tt2.tt_id = td.tt_id AND a.a_id = td.a_id and c_taskCompleted = 1 
	where td.tt_id IS NULL and tt2.s_id = tt.s_id and tt2.i_id_source = tt.i_id_source order by tt2.tt_order) k

	WHERE tt.i_id_source != 5260  and tt.tt_id = k.tt_id

Связь таблицы с собой

$
0
0
Добрый день.
Есть таблица со столбцом "UserID", куда пишется уникальный идентификатор пользователя.
Каждый UserID может дружить с несколькими другими UserID.
Как наиболее правильно реализовать запись данных об этой дружбе, если учесть, что все UserID находятся в одной таблице в одном столбце?
Viewing all 7251 articles
Browse latest View live