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

динамически добавления удаления всех таблиц датабейз

$
0
0
добрый денъ
возможна сделатъ все круд операции с помошю 1 прочедуре или инсерт 1 опдейт 1 делете 1

буду работат так

exec dbo.delete_table(@table_name,@id) ----ето для делете с любой табличы

exec dbo.update_table(@table_name,@cols,@id)

exec dbo.insert_table(@table_name,@values ) или (@table_name,@value1,@value2.....@valuen )

?

Цикл по таблице без функции

$
0
0
Добрый день.
Подскажите пожалуйста, можно решить такую задачу без напичания функции?
Есть таблица tb1, откуда по входному item получаю список строк, пробегаюсь по ним по колонке job, на каждой строке делаю запрос в таблицу tb2, оттуда получаю item, запрашиваю в tb2. И так до тех пор пока таблица tb1 ничего не отдаст. Тогда этот item записываю во временную таблицу result. Эту таблицу result вывожу.
Заранее благодарю.

Добавления связанного сервера в SQL Server 2014

$
0
0
Имеем сервер MSSQL Server 2014, хочу добавить связанный сервер со старой машины Windows 2000 (SQL Server 8.00.194). Подключить напрямую через SSMS 18 не вышло, проблемы с драйвером, но получилось через добавление старого сервера в системные DSN (VostSqlDSN), выполнив следующий скрипт у меня все вышло, сервер был добавлен (VostSql) и доступ есть:

EXEC sp_addlinkedserver @server = N'VostSql',
@srvproduct=N'MSDASQL',
@provider=N'MSDASQL',
@datasrc = N'VostSqlDSN',
@location=N'System';

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'VostSql',
@useself=N'True',
@locallogin=NULL,
@rmtuser=NULL,
@rmtpassword=NULL
GO

Вопрос такой, как напрямую используя строку подключения @datasrc подключится к серверу, минуя добавления в источники данных системного DSN.

with execute as не работает с другой базой

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

Верно ли, что если ХП запускается с "with execute as", то её выполнение происходит на уровне пользователя этой Базы, и нет никакой возможности сделать в этой ХП SELECT к другой базе ("SET TRUSTWORTHY ON" не предлагать)
?

Ошибка: ...is not able to access the database... under the current security context

триггер на view

$
0
0
Коллеги, добрый день.
В первый раз делал триггер.
Идея такая.
на сервере 1 есть view, которая селектит дату из таблицы источника.(у меня к таблице источнику доступа нет и не будет).
Как только новая дата обнаружилась во вьюхе триггер должен запустить ДЖОБ и залогировать эту дату в таблицу на нашем сервере и далее запустить процесс. В случае, если во вьюхе появится еще одна новая дата, то триггер должен остановить джоб и запустить его заного и так до бесконечности пока не перестанут появляться новые даты во вьюхе. Сделано это с целью согласованности данных в БД.

Написал код:

CREATE TRIGGER dbo.check_new_data_and_start_job 
   ON  dbo.vClosedDay_in_source  --вьюха, которая идентифицирует новую дату в источнике
   AFTER INSERT,UPDATE
AS 
BEGIN
	DECLARE @job_id UNIQUEIDENTIFIER --ID джоба, который нужно запускать, останавливать
	DECLARE @InDateTime datetime --новая дата во вьюхе
	DECLARE @DateInitial datetime --старая дата в таблице нашей, куда должна произойти запись новой
	DECLARE @Enabled int -- статус работы джоба 1-работает, 0 - не работает
		
		SET @job_id = (SELECT job_id FROM msdb.dbo.sysjobs
					   WHERE job_id = 'Load_fastclosing')		--определяем ID джоба по названию		   
		SELECT @InDateTime = (SELECT MAX(InDateTime) FROM ourserv.ourbase.dbo.vClosedDay_in_source)	 --определяем новую дату
		SELECT @DateInitial = (SELECT DateInitial FROM ourserv.ourbase.dbo.ClosedDayStatus_source) --определяем старую дату
		SELECT @Enabled = (SELECT enabled FROM msdb.dbo.sysjobs
						   WHERE [name] = 'FastClosing_onClosedDays') -- уточняем статус джоба 

	IF (@InDateTime > @DateInitial AND @Enabled = 1) --сравниваем дату вьюхи и таблицы
		EXEC msdb.dbo.sp_stop_job @job_id = @job_id --если джоб работает останавливаем

		EXEC msdb.dbo.sp_start_job @job_id = @job_id -- и перезапукаем.

	
END
GO

При попытке создать тригер выдает ошибку:

The object 'dbo.vClosedDay_in_source' does not exist or is invalid for this operation

Коллеги, как я понимаю дело во вьюхе.
Есть, конечно вариант создать процедуру, котрая заполняла бы новую таблицу свежими данными, а уже на эту таблицу делать триггер. Но как то во вьюхе то все таки можно осуществить процесс такого плана.
Заранее благодарен Вам за ответы.

Возможно ли создать поле UNIQUE, которое может принимать значение NULL?

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

Задача создать поле которое по умолчанию имеет значение NULL, по истечению времени оно будет заполняться, и, значения должны быть уникальны в рамках таблицы по данному полю (исключение значение NULL).

Возможно ли создать такой индекс?

Откатить состояние базы.

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

Подскажите можно ли как-то решить задачу:

18:02 Несколько запросов не удаление данных из таблички А.
18:04 Запрос на удаление таблички Б

В 18:05 опомнились.

Возможно ли как-то откатить состояние базы (быстро) на состояние 18:00 (без подъема полного бекапа, потому что это долго) ?

Подскажите хотя бы ключевые слова по которым гуглить.
Дальше сами будем смотреть и изучать.

высокая нагрузка на ЦП MS SQL server 2014 CU3

$
0
0
нагрузка на ЦП от 80-99% запросы тормозят.
В прошлом месяце при той же нагрузке пользователями цп был максимально 80% тормозов не наблюдалось.
хар-ки
ОЗУ 480ГБ
ЦП 32 логических
windows server 2012 standard release 6.2
по дискам проблем нет
обслуживание БД работает

Ранее подобные траблы решали перезагрузкой инстанса, теперь это не помогает.
что пробовали делать:
Разработчики оптимизировали кучу ТОП запросов с нагрузкой на ЦП, это не помогло.
Пробовали включать выключать разные флаги, нее помогло.
Меняли MAXDOP c 4 до 16, нет разницы
меняли cost Threshold for parallelism с 15 до 50, нет разницы

А, да, до этого работали на CU2. 20 июля поставили CU3

Куда копать? Что делать? Подскажите

посчитать кол-во часов в наложениях рабочего графика

$
0
0
подскажите, пожалуйста, как решить такую задачу:
необходимо посчитать общую сумму часов в наложениях рабочего графика.
наложения - это когда в одно и тоже время работает более одного сотрудника.


таблица имеет вид:
EmployeeID
DateStart
DateEnd

где DateStart - дата и время начала работы в графике,
DateEnd - дата и время окончания работы в графике

максимальная сумма из таблицы

$
0
0
Добрый день!
прошу помочь
подскажите пож-та как вытащить максимальную сумму зарплаты из таблицы, при этом вытащить контракт и сумму. Делаю так, но не работает. вытаскивает все контракты, а мне нужен один контракт с максимальной суммой
SELECT contract_number, MAX(balance)
from T1 where date = '2019-08-01' group by contract_number,balance
order by balance desc

if в where

$
0
0
Добрый день.
Задача в следующем. Необходимо выгрузить заявки из системы, которые были зарегистрированы в рабочее время.
Рабочее время: пн-чт с 9 до 18, пт с 9 до 16:45. Так же необходимо учесть праздничные и предпразничные дни. В предпразничный день рабочее время с 9 до 16:45.
Праздничные дни исключил при помощи таблицы, в которой хранятся праздничные дни. Выглядит это примерно так
and incident.date_logged not in ((select hplan1 from hplan_head where hplan_head_id=2))

Выходные исключил так:
and DATEname (WEEKDAY, incident.date_logged) not in ('Sunday', 'Saturday') --исключить выходные

Самое сложное для меня это установить рабочее расписание. Как ограничить выгрузку в предпразничный день до 16:45 если он выпадает на среду (при этом вне праздничного дня выводил до 18:00).
Рабочее расписание выставил как то так:
AND ((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday'))

Так же вывел предпразничный день и задал ему рабочее расписание
(((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))


Вопрос: Как мне задать условие if в where, чтобы при выгрузке бралось рабочее расписание, но если выпадает предпразничный день то он выгружал до 16:45?

Полный селект не выкладываю так как он очень большой.
Дополнительно выкладываю часть скрипта как он есть
AND ((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday'))
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))

Как преобразовать массив в столбец?

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

Не могу найти информацию.


Иметтся строка:

'1,2,3,4,5'

Как из нее получить столбец:

1
2
3
4
5

?


Нужно что-то аналогичное UNNEST в PG или table() oracle


Подскажите пожалуйста.

SSRS (detail report)

$
0
0
В SSRS есть такая опция, можно вызывать вложенный отчёт кликая на основной. Это удобно при детализации и достаточно просто реализовать.
Но смущает то что, детализация открывается не в отдельном окошке, а в первом, где был основной отчёт (закрывая его).
Есть ли возможность, чтобы вложенный отчёт открывался в отдельной вкладке?
Может это в свойствах IE где то кроется?
Извините , если вопрос ламерский :-)

Запрос с счётчиком со сбросом

$
0
0
Добрый день.
В таблице есть поле Price, в котором находятся числа. Нужно на основе поля Price в той же таблице заполнить целочисленное поле Order по следующему принципу: туда помещается последовательный счётчик записей, который сбрасывается когда в поле Price встречается число меньше предыдущего. Счёт счётчика для первой записи и после сброса начинается с 1. Для примера:

Price Order
------------ -------------
10 1
9 1
11 2
8 1
9 2
11 3
12 4
7 1
13 2
15 3
16 4
21 5
18 1
20 2
Как это реализовать на SQL?

PUSH уведомления напрямую из SQL Server (может кому понадобится)

$
0
0
Всем привет
Долго ломал голову, как бы отправлять PUSH через FIREBASE напрямую из SQL, не используя сервисы или другие приложения
Вот решение (если кому пригодится)
+
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Для разрешения выполнения процедур OA выполнить вот это******/
/*
USE [master]
sp_configure 'show advanced options', 1 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

use DB
GRANT EXECUTE ON master..sp_OACreate to usr
GRANT EXECUTE ON master..sp_OASetProperty to usr
GRANT EXECUTE ON master..sp_OAMethod to usr
GRANT EXECUTE ON master..sp_OADestroy to usr

*/
CREATE PROC [dbo].[usp_SEND_FCM_MESSAGE_TEST]
AS
DECLARE @Object INT;
DECLARE @Status INT;
DECLARE @ResponseText nvarchar(4000);
DECLARE @StatusText nvarchar(4000);
DECLARE @ResponseBody  nvarchar(4000);
DECLARE @Authorization nvarchar(4000) ='key=AAAA6koGkM8:APA91bGcnmbWVcPQeKwpD18IvBBqczuGU9VfzEVc_sS4vAuc8MuFjwR-laSb33jx60ra3efhzE-WLuNy7OitTMyqEZYW_Sdy75ipZX6Z9tqNbzygDWeFdbCJNw9SchVdayeeSvK-u2i0'
DECLARE @Sender nvarchar(4000) = 'id=1006994291535';

DECLARE @Success varchar(10);
DECLARE @ErrorCode varchar(10);
DECLARE @requestBody NVARCHAR(4000) = N'{
"to": "dAvktxTh6i8:345435345345435-V9ISsi2IVlnwnzyIFHWeQ0qmYn1KyLK_QIT-QeZH68FBe2kTBFrG70HfDOg-23I2WiTsDirfCWaBzsL0noL8OWe4E80jnLhlMIdqR",
"data": {
	"ShortDesc": "Some short desc",
	"IncidentNo": "any number",
	"Description": "detail desc"
  },
  "notification": {
	"title": "ServiceNow: Incident No. number",
    "text": "This is Notification",
	"sound":"default"
  }
}'

EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST',  'https://fcm.googleapis.com/fcm/send', 'false'
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json; charset=utf-8'
DECLARE @len INT = len(@requestBody) 
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Length', @len
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Authorization', @Authorization
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Sender', @Sender
EXEC sp_OAMethod @Object, 'send', null, @requestBody
EXEC sp_OAGetProperty @Object, 'Status', @Status OUTPUT
EXEC sp_OAGetProperty @Object, 'ResponseText', @ResponseText OUTPUT
EXEC sp_OAGetProperty @Object, 'statusText', @StatusText OUTPUT
EXEC sp_OADestroy @Object

PRINT cast(@Status as varchar(100)) +'('+@StatusText+') '+ @ResponseText

вопрос по обозревателю объектов в SSMS

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

Для обучающего курса нужно кратко описать пункт storage, он же хранилище, в обозревателе объектов SSMS - без особых подробностей. Гугл не помог.

Подскажите, пжл.

системные таблицы в бд

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

Подскажите, пож-та, можно ли как-то вывести список всех системных таблиц в БД?

Итог по столбцу с условием в строке

$
0
0
Добрый день!
Подскажите, как можно реализовать расчет:
ИДЗаказИДСкладИДАдресИДПродукцияДатаДата-30Количество
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155
1112223334442019-07-312019-07-0155

Итог по столбцу с условием в строке

$
0
0
Добрый день!
Подскажите, как можно реализовать расчет.
Есть таблица
ИДЗаказИДСкладИДАдресИДПродукцияДатаДата-30Количество
1112223334442019-07-312019-07-0155
1112223334442019-07-302019-06-3055
1112223334442019-07-292019-06-2955
1112223334442019-07-282019-06-2855
1112223334442019-07-272019-06-2755
1112223334442019-07-262019-06-2655
.....................

Необходимо создать расчетное поле, в котором будет отображаться сумма по столбцу количество,где Дата>=Дата-30 и Дата<=Дата.

ms sql server continuous integration and shared static data

$
0
0
почитал про инструменты continuous integration для баз данных вообще и для MS SQL в частности.

принцип понятен:
1. создаем дев-тест-merge-build-.... окружения различными способами
2. заливаем тестовые данные в эти окружения
3. тестируем-билдим...
4. заливаем на прод

получается, что нужно много баз с тестовыми данными.

если у нас корпоративное приложение с рабочей базой на MS SQL в несколько терабайт, то возникает вопрос как сделать корректные тестовые данные? генерить собственную маленькую AdventureWorks - тот еще проект с непонятной трудоемкостью и непонятной корректностью.

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

возникает технический вопрос к MS SQL - а можно ли как-то сказать MS SQL что у данных в разных базах есть общий (shared) кусок первоначальных данных, а в каждом окружении храни только изменения от этого куска?

что-то вроде снапшотов для виртуальных машин (внимание! снапшоты MS SQL не подходят, поскольку они дают только read-only доступ к данным).
или вроде докера для данных.

есть ли такое? как называется?
ткните носом куда рыть, пожалуйста.
Viewing all 7251 articles
Browse latest View live