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

обновление поля в котором хранится время последней редакции записи, как правильнее?

$
0
0
Уважаемые, добрый день!
По работе возникла необходимость немного подправить логику работы MS SQL server (2012).
Сам работаю с PostgreSQL.
Возник вопрос: как правильнее всего обновлять время последнего редактирования записи.
Погуглил, если я правильно понимаю, то используем insted of update trigger, а в нем
(pk - primary key, f* - любое другое поле, f_last_edit - поле для хранения времени последней редакции записи):
update dst_tbl
SET f1 = ins.f1, f2 = ins.f2, f3 = ins.f3, f_last_edit = getdate()
from inserted ins
where dst_tbl.pk = ins.pk;

Получается, что если кто-то добавит еще одно поле в таблицу dst_tbl, то триггер необходимо обязательно менять.
Возможно есть более элегантное решение данного вопроса?

Максимальный возрас,минимальный возраст для каждого города

$
0
0
SELECT MAX(AGE) as 'Max', MIN(BirthDate) as 'Min'
WHERE City='?'

Помогите, как прописать условие для каждого города?

Подсчет закзов за год и JOIN LEFT

$
0
0
Помогите пожалуйста с заданием:
Показать первые имена и фамилии сотрудников, а также подсчет заказов каждого из них получили в течение года 1997 года (использование соединения слева).Ничего не выводит

SELECT FirstName, LastName, ShippedDate
FROM Employees LEFT JOIN Orders
ON Employees.EmployeeID=Orders.EmployeeID
Where ShippedDate in
(SELECT COUNT(ShippedDate)
From Orders
Where YEAR(ShippedDate)=1997)

Having count, оптимизация

$
0
0
Уважаемые подскажите, как можно оптимизировать запрос?
Кол. Строк: t1=10млн., t2=4000, дикий план смогу позже предоставить.

Select t1.f1, t1.f2
From t1
 Inner join t2 on t1.f1=t2.f1
 Inner join 
  (
  Select t1.f1, t2.f2 
  From t1
   Inner join t2 on t1.f1=t2.f1
  Group by t1.f1, t2.f2
  Having count(t1.f3) >1
  ) as t3 on t3.f1=t1.f1 and t3.f2=t1.f2

Count , вложеный запрос?

$
0
0
Количество заказов, сделанных каждым клиентом из города Москва.

+
SELECT FirstName, LastName, City, OrderID
from Employees, Orders
WHERE OrderID in (SELECT COUNT(OrderID) FROM Orders
GROUP BY OrderID)

Разростаеться журнал транзакции в MS SQl 2012? ,база в зеркале, как уменьшить журнал?

$
0
0
Добрый день, нужна помощь.

Есть кластер из 2 нод и 1 диска кворума. Кластер поддерживает кластеризованную службу ( по приоритету). Приложение работает на MS SQL 2012 и имеет модульную структуру подключения к БД от рабочих станций.
В MS SQL 2012 настроено зеркалирование баз (между двумя нодами) , естественно с моделью FULL.
На данный момент база весит 23 Гб, журнал транзакции 210 Гб и он неминуемо растет.
Озаботившись тем, что совсем скоро иссякнет дисковое пространство хочу узнать что делать.

Как урезать журнал транзакций?
Модель восстановления не меняеться с фулл на симпл если не отключить зеркало. Если я отключу зеркало и сожму журнал через реорганизацию, потом опять заново зеркало настраивать?

В общем не знаю, что делать. Хелп

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

$
0
0
Доброго времени суток.
Есть таблица с показаниями счетчика машины на:
(06-30 16-00) 1 смена
(16-30 23-59) 2 смена
(00-01 06-30) 3 смена


CREATE TABLE [dbo].[TotalCounters_Test1](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[OnlyDate] [date] NULL ,
	[OnlyTime] [time](7) NULL ,
	[Sorter] [int] NULL)



+
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 1543) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 1543) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 1678) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 1678) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 1800) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160810',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 1800) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 1967) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 1967) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 1567) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 1567) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 1624) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160811',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 1624) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 1789) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 1789) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 1900) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 1900) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 2078) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160812',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 2078) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 2300) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 2300) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 2456) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 2456) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 2567) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160813',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 2567) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 2677) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 2677) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 2832) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 2832) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 2993) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160814',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 2993) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 3190) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 3190) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 3342) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 3342) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 3523) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160815',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 3523) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '23:59:00.0000000', 114 ), 3700) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '00:01:00.0000000', 114 ), 3700) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '06:30:00.0000000', 114 ), 3802) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '06:31:00.0000000', 114 ), 3802) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '16:00:00.0000000', 114 ), 3983) ;
INSERT INTO TotalCounters_Test1 VALUES ( convert(DateTime,'20160816',112),Convert( VarChar( 10 ), '16:01:00.0000000', 114 ), 3983) ;



пытаюсь написать запрос но не очень получается:

SELECT TOP 7 *
FROM        (SELECT        OnlyDate, MAX(Sorter) - MIN(Sorter) AS I_smena
            FROM dbo.TotalCounters_Test1  WHERE  (OnlyTime BETWEEN '06:30:00' AND '16:00:00')
			GROUP BY OnlyDate) T1

left join  (SELECT        OnlyDate, MAX(Sorter) - MIN(Sorter) AS II_smena
            FROM dbo.TotalCounters_Test1 WHERE (OnlyTime BETWEEN '16:00:00' AND '23:59:59')
			GROUP BY OnlyDate) T2 on T2.OnlyDate=T1.OnlyDate

 left join (SELECT        OnlyDate, MAX(Sorter) - MIN(Sorter) AS III_smena
            FROM dbo.TotalCounters_Test1  WHERE (OnlyTime BETWEEN '00:00:01' AND '06:30:00')
			GROUP BY OnlyDate) T3	on T3.OnlyDate=T1.OnlyDate
 order by T1.OnlyDate desc


/*
 left join	(SELECT OnlyDate, T1.Sorter_I + T2.Sorter_II + T3.Sorter_III AS Day_Total 
            FROM dbo.TotalCounters_Test1 AS p 
			  ) T4  on T4.OnlyDate=T3.OnlyDate
*/


нужно получить таблицу:

OnlyDate !! I_smena !! II_smena !! III_smena !! Total (I+II+III)

ps. III_smena это данные за следующие сутки . рабочие сутки начинаются с 06.30 утра и заканчиваются в 06.30 следующего дня

заранее благодарю за помощь.

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

$
0
0
USE WorkDBSQL;
GO

BEGIN TRANSACTION;

DECLARE @LastDate DateTime = (SELECT TOP 1 DateTimeEnd FROM TotalJrnl ORDER BY DateTimeEnd DESC);

WITH JournalTmp AS
(SELECT DateAdd(minute, 15 * (DateDiff(minute, '19000101', jDate) / 15), '19000101') AS jDate, jFactDose, jDest FROM Journal_TWC_201_2 
	WHERE @LastDate IS NULL OR jDate >= @LastDate)

MERGE INTO
  TotalJrnl
USING
	(SELECT jDate, CAST(SUM(jFactDose) AS decimal(12,2)) AS jFactDose, MAX(jDest) AS jDest
	FROM JournalTmp GROUP BY jDate) AS TmpData
ON
  DateTimeEnd = TmpData.jDate
WHEN MATCHED AND (jDest = 0) THEN
		UPDATE SET TWC_201 = TmpData.jFactDose
--WHEN MATCHED AND (jDest = 1) THEN
--		UPDATE SET TWC_201 = TmpData.jFactDose, TWC_201_1 = TmpData.jFactDose
--WHEN MATCHED AND (jDest = 2) THEN
--		UPDATE SET TWC_201 = TmpData.jFactDose, TWC_201_2 = TmpData.jFactDose
--WHEN MATCHED AND (jDest = 3) THEN
--		UPDATE SET TWC_201 = TmpData.jFactDose, TWC_201_3 = TmpData.jFactDose
--WHEN MATCHED AND (jDest = 4) THEN
--		UPDATE SET TWC_201 = TmpData.jFactDose, TWC_201_4 = TmpData.jFactDose

WHEN NOT MATCHED AND (jDest = 0) THEN
	INSERT (DateTimeEnd, TWC_201) VALUES (TmpData.jDate, TmpData.jFactDose)
--WHEN NOT MATCHED AND (jDest = 1) THEN
--	INSERT (DateTimeEnd, TWC_201, TWC_201_1) VALUES (TmpData.jDate, TmpData.jFactDose, TmpData.jFactDose)
--WHEN NOT MATCHED AND (jDest = 2) THEN
--	INSERT (DateTimeEnd, TWC_201, TWC_201_2) VALUES (TmpData.jDate, TmpData.jFactDose, TmpData.jFactDose)
--WHEN NOT MATCHED AND (jDest = 3) THEN
--	INSERT (DateTimeEnd, TWC_201, TWC_201_3) VALUES (TmpData.jDate, TmpData.jFactDose, TmpData.jFactDose)
--WHEN NOT MATCHED AND (jDest = 4) THEN
--	INSERT (DateTimeEnd, TWC_201, TWC_201_4) VALUES (TmpData.jDate, TmpData.jFactDose, TmpData.jFactDose);

COMMIT TRANSACTION;


Есть таблица Journal_TWC_201_2 из которой надо произвести усреднение по времени (в данном случае 15 минут), вычисленную сумму из колонки jFactDose за период положить в колонку TWC_201 таблицы TotalJrnl и время за которое усреднялось в колонку DateTimeEnd таблицы TotalJrnl - это у меня работает.
Но есть еще задача при jDest из таблицы Journal_TWC_201_2 отличном от 0 дублировать эту сумму в колонку таблицы TotalJrnl (имя колонки строится так - TWC_201_ и цифра из jDest)...
Пытался сделать несколько WHEN MATCHED AND и WHEN NOT MATCHED AND, но их оказывается нельзя использовать больше одного... Помогите переделать эту часть правильно пожалуйста.

псевдоснапшот для отчетов

$
0
0
сам я не местный, работал с Ораклом, потому хочу узнать мнение бывалых

Будет группа отчетов со сложными вычислениями. Отчеты планируется выполнять много раз в день
Решили сложные вычисления перенести в процедуру и формировать промежуточную таблицу (по шедуллеру; скажем, раз в 3 часа, бизнес это устраивает), на основании той таблицы и будут строиться отчеты. Строк в той таблице будет не так чтобы сильно много - скажем, 100 тыщ.

Как правильно формировать эту таблицу, чтобы в момент перезаливки данных отчеты формировались на основании предыдущих?

как-то так?
begin transaction
delete Table;
<много вычислений и 10-20 минут времени>
commit transaction;
не будет это накладно для MS SQL 2012?

Или сделать две таблицы; вторую заполнять этими долгими алгоритмами, а потом ее данными быстро обновлять главную?

Зачем нужен rollback, если есть commit?

$
0
0
Добрый вечер! Если я правильно понял, то, начав транзакцию (1) и дойдя до коммита (2), все DML-операции между этими командами (1) и (2) вступят в силу. Тогда зачем нужен rollback? Часто его суют в catch, так и не пойму: для чего?

Автоматическое создание моментальных снимков БД

$
0
0
Люди добрые, подскажите, каким образом отключить автоматическое создание моментальных снимков БД?
Посмотрел сведения о созданных бэкапах и увидел, что каждый вечер и ночь создаются по два моментальных снимка БД. В агенте нет заданий на их создание. Так как же от них избавиться? Кстати, они не позволяют создавать разностный бэкап БД...

Подключение к удаленной БД.

$
0
0
Добрый день. Стоит задача: вынести БД предприятия за пределы офиса. Арендовал выделенный сервер, хочу перенес туда базу для тестов.
Учетная программа (не 1С) связывается с БД через подключение типа .udl .
Вопрос: как настроить sql server на удаленном сервере и саму .udl так, чтобы они коннектились.
Пробовал в .udl в строке имя сервера писать "ip сервера\SQLEXPRESS", но пока выдает ошибку соединения.
Помогите пожалуйста. Заранее спасибо!

Некорретная работа оптимизатора при присвоении переменных внутри SELECT

$
0
0
Добрый день
Некорректно отрабатывается CASE в случае использования подзапросов и присвоения переменных

declare @c int=1,
        @case int
declare @t table (c int)
insert @t select 1

select 
  @c=2,
  @case = case when @c in (select * from @t) then 10000+@c else NULL end

select @c, @case


по логике, кейс должен попасть в ветку с NULL
практически он туда не приходит, при анализе вхождения почему то берется старое значения переменной @c

при этом при изменении запроса (заменяем табличную переменную на простой селект) - все начинает работать коррентно

declare @c int=1,
        @case int
declare @t table (c int)
insert @t select 1

select 
  @c=2,
  @case = case when @c in (select 1) then 10000+@c else NULL end

select @c, @case


при выносе присвоения наружу проблема также уходит
declare @c int=1,
        @case int
declare @t table (c int)
insert @t select 1

set @c=2
select 
  @case = case when @c in (select * from @t) then 10000+@c else NULL end

select @c, @case


проблема обнаружена на 2008+ версиях сервера
селект приведен только для примера - в реальности у нас куча гораздно более сложного кода с подобным синтаксисом
перейти на отдельные сеты сильно сложно

Возможно ли как то заставаить корректно отрабатывать такую конструкцию?

DateTime(long.Parse(636129859939309975)) Как сделать в MS-SQL

$
0
0
Добрый днеь, форумчане.

Есть поле в бд bigint.

В С# вот ак вот оно прводится к дате

DateTime(long.Parse(636129859939309975))

Как сделать привидение к datetime в MS-SQL?

,CAST(dateReg AS datetime) приводит к ошибке :
Arithmetic overflow error converting expression to data type datetime.

не прикрепляется к письму файл, который на другом ПК

$
0
0
Не могу отправить письмо с вложением файла, который лежит в сети:
не цепляется вложение
Сообщение 22051, уровень 16, состояние 1, строка 0
Attachment file \\10.0.2.114\c$\Letter\ATTACH\Temp\1.txt is invalid.


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'email',
@recipients = '1@tank.ru',
@body = 'Test',
@subject = 'Test',
@file_attachments = '\\10.0.2.114\c$\Letter\ATTACH\Temp\1.txt';

файл есть. c машины, где работает служба sql server могу обратиться по указанному адресу.

но запрос,
DECLARE @result int

EXEC @result = master..xp_cmdshell 'DIR \\10.0.2.114\*.txt'


возвращает, что Вход в систему не произведен: имя пользователя или пароль не опознаны.

объедин. 2 таблиц с версионностью

$
0
0
Привет всем.

Надо получить итоговю табл. C c полным набором атрибутов, и "пересечением" версионностей, т.е. как только в одной из таблиц Tarifs или Abonents произошла смена версии в C также должна смениться версия. Если версия сменилась одновременно, в обеих таблицах, то в C версия должна смениться один раз.
Tarifs
abon_id tariff_plan type from_date to_date
1 1 1 01OCT2005 01JAN2040
2 1 2 05NOV2005 01DEC2006
2 2 2 02DEC2006 01DEC2007
2 2 1 02DEC2007 01JAN2040
3 0 0 07NOV1917 11JUN1991
3 1 1 12JUN1991 01JAN2040
4 1 1 12JUN1991 01JAN2040

Abonents
abon_id name sex from_date
1 Igor M 01OCT2005 01JAN2040
2 Vasya M 05NOV2005 01AUG2006
2 Lena F 02AUG2006 02SEP2007
2 Yulia F 03SEP2007 01JAN2040
3 USSR Country 07NOV1917 11JUN1991
3 Russia Country 12JUN1991 01JAN2040
4 Petya M 12AUG1991 01JAN2040

1) Через T-sql
2) в идеале чистый SQL без аналит. ф-ций

зы Не то чтобы нужен готовый код - скорей идеи или алгоритм
я реализовал лет 10 назад такое на VFP (xbase) - для расчета учета по телефонам АТС

зы гуглил по интервалам - но там из 1 таблицы - возможно можно как-то адаптирваоть

Своё сообщение при rollback

$
0
0
Подскажите как можно изменить стандартное сообщение при rollback?
Пользуюсь MS SQL Server 2008 r2, поэтому RAISEERROR не предлагать.

Заранее спасибо.

Регистр

$
0
0
Подскажите пожалуйста, как мне реализовать выборку данных, но только тех которые написаны большими буквами.

Пример:

Дом - Не выводим

ДОМ - Выводим

Download SQL Server Management Studio (16.5.1)

Нумерация строк SELECT-а

$
0
0
Необходимо вставить во временную таблицу результат выполнения SELECT-а с нумерацией строк согласно используемому ORDER BY:

CREATE TABLE #a(ord INT NOT NULL PRIMARY KEY, col1 ..., col2 ...)

INSERT #a(ord, col1, col2, ...)
SELECT ???, col1, col2, ...
FROM ...
ORDER BY ...


Нашел 3 варианта:

1) использовать IDENTITY(1, 1) для ord - не подходит, т.к. в дальнейшем нужно делать UPDATE #a.ord;
2) использовать ROW_NUMBER() OVER(ORDER BY ...) в SELECT - медленнее 1го варианта;
3) использовать NEXT VALUE FOR sequence OVER(ORDER BY ...) в SELECT - по скорости примерно как 2й вариант.

Может есть какие-нибудь другие (быстрые) способы?
Viewing all 7251 articles
Browse latest View live