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

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

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

Выполняю обработку списка телефонных номеров на стороне клиентского c# приложения. Задача в том, чтобы определить для каждого номера телефона, к какому региону\городу он принадлежит. В базе данных хранится информация по сопоставлению всех кодов телефонов по всем операторам связи с регионами\городами в формате, представленном ниже. Записей в этой таблице сопоставления 23 000. За 1 раз осуществляется обработка порядка 3 000 телефонных номеров в 100 параллельных потоков, задача регулярная, и поэтому важна производительность решения.
Помогите, пожалуйста, сделать оптимальный запрос на быстрое получение данных из таблицы сопоставления по 1 номеру телефона. Например, как можно получить из таблицы сопоставления код региона для номеров телефонов: 89994911546 и 89825594623?

Пример данных таблицы сопоставления "код телефона-регион"
create table t_REG_TelCodes
(
	tl_id int identity(1,1) primary key,
	i_id_region int,
	tl_code nvarchar(11)
)
insert into t_REG_TelCodes(i_id_region, tl_code) select 1, '9994911xxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 1, '9994912xxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 1, '9994913xxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 2, '9994919xxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 2, '9994920xxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 3, '98302xxxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 3, '983030xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 3, '983031xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 3, '983032xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 4, '983050xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 5, '983051xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 6, '983052xxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 7, '9825xxxxxx'
insert into t_REG_TelCodes(i_id_region, tl_code) select 8, '9826xxxxxx'

Функция ранжирования

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

Составил запрос, дальше не могу продвинуться

  WITH CTE AS (
    SELECT
          t.id as 'technician_id'
         ,s.date
         ,s.time_from
         ,CAST(s.time_from AS TIME) as 'hour'
         ,ROW_NUMBER() OVER(PARTITION BY t.id, s.date ORDER BY s.time_from) as 'rn'

    FROM time s
    INNER JOIN technic t ON s.technician = t.id
    WHERE s.schedule IS NULL
  )


  SELECT
     c1.*
    ,RANK() over (PARTITION BY c1.technician_id , c1.date, IFNULL(TIMESTAMPDIFF(hour, c2.hour, c1.hour), 1) ORDER BY c1.time_from) as 'megarank'

  FROM CTE c1
  LEFT JOIN CTE c2 ON c1.technician_id = c2.technician_id
                  AND c1.date = c2.date
                  AND c1.rn = c2.rn + 1

technician_iddatetime_fromhourrnrank
4613102019-02-102019-02-10 12:00:0012:00:0011
4613102019-02-112019-02-11 10:00:0010:00:0013
4613102019-02-112019-02-11 11:00:0011:00:0022
4613102019-02-112019-02-11 12:00:0012:00:0031
4613102019-02-112019-02-11 15:00:0015:00:0042
4613102019-02-112019-02-11 16:00:0016:00:0051
4613102019-02-112019-02-11 18:00:0018:00:0063
4613102019-02-112019-02-11 19:00:0019:00:0072
4613102019-02-112019-02-11 20:00:0020:00:0081

Организация вывода взаимосвязных таблиц в одну

$
0
0
Здравствуйте, есть БД (Отрывок на фото), пишу хранимую процедуру которая ищет по определенным параметрам и генерирую отчет в C#. проблема в следующем: мне надо что бы генерировало как в варианте 1 а сейчас генерируется как во 2 варианте. Кто знает как сделать? или это уже надо в win forme делать ?


Хранимая процедура:

USE [Lombard]
GO
/****** Object:  StoredProcedure [dbo].[YVD]    Script Date: 11.02.2019 11:06:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[YVD] @dataot NVARCHAR(10), @datado NVARCHAR(10) 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
select t_pledge.data, t_subject.name_subject, t_subject.comments, 
(t_person.surname+' '+t_person.name+' '+t_person.patronymic) as thisclient, 
(t_document.tip_documenta+': '+t_document.series+' '+t_document.number+', '+t_document.issued) as doc,
 t_meta_property.name_meta_property, t_property.value
FROM t_subject 
JOIN t_pledge ON t_pledge.id_pledge=t_subject.id_pledge
JOIN t_person ON t_person.id_person=t_pledge.id_client
JOIN t_document ON t_document.id_document=t_pledge.id_document
JOIN t_property ON  t_property.id_subject=t_subject.id_subject
JOIN t_meta_property ON t_meta_property.id_meta_property=t_property.id_meta_property
WHERE t_subject.status='В залоге' AND t_pledge.data>@dataot AND t_pledge.data<@datado
END

Не работает диаграмма баз данных

$
0
0
Здравствуйте!
Имеется SQL srver Express. Подключаюсь к нему через MS SQL Server Management Studio 2017. Аутентификация "Проверка подлинности Windows". Создаю БД, таблицы, хранимую процедуру, но как только я пытаюсь добавить диаграмму БД выходит ошибка:

ЗАГОЛОВОК: Microsoft SQL Server Management Studio
------------------------------

Не удалось получить сведения о пользователе или группе Windows NT "DOMAIN\USER", код ошибки: 0x5. (Microsoft SQL Server, ошибка: 15404)

Чтобы получить справку, щелкните: http://go.microsoft.com/fwlink?ProdName=Microsoft SQL Server&ProdVer=12.00.5000&EvtSrc=MSSQLServer&EvtID=15404&LinkId=20476

------------------------------
КНОПКИ:

ОК
------------------------------

В чем загвозка? Как мне отношения выставить?

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

SUM() OVER(). Почему из положительных значений получаются отрицательные?

$
0
0
Разве считаются не все предыдущие суммы до текущей?

DECLARE @Tbl TABLE (id INT IDENTITY(1, 1), _clientId INT, _date DATE, _sum INT);

INSERT @Tbl VALUES
  (1, '01.02.2019', 20), (1, '02.02.2019', 50), (1, '02.02.2019', 80), (1, '01.01.2019', 100), (1, '01.01.2019', 90), 
  (1, '01.01.2019', 40), (1, '01.01.2019', 30), (1, '03.02.2019', 70), (1, '07.02.2019', 60), (1, '07.02.2019', 10),
  (2, '12.02.2019', 180), (2, '12.02.2019', 190), (2, '13.02.2019', 130), (2, '01.02.2019', 200), (2, '02.02.2019', 140), 
  (2, '03.02.2019', 150), (2, '08.03.2019', 170), (2, '11.02.2019', 160), (2, '17.02.2019', 120), (2, '17.02.2019', 110);


SELECT _clientId,
       id,
       _date,
       _sum,        
      -SUM(_sum) OVER(PARTITION BY _clientId ORDER BY _date, id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS _RowsUnPredAndCurr 
  FROM @Tbl
  ORDER BY _clientId, _date, id;




_clientId id _date _sum _RowsUnPredAndCurr
----------- ----------- ---------- ----------- ------------------
1 4 2019-01-01 100 -100
1 5 2019-01-01 90 -190
1 6 2019-01-01 40 -230
1 7 2019-01-01 30 -260
1 1 2019-02-01 20 -280
1 2 2019-02-02 50 -330
1 3 2019-02-02 80 -410
1 8 2019-02-03 70 -480
1 9 2019-02-07 60 -540
1 10 2019-02-07 10 -550
2 14 2019-02-01 200 -200
2 15 2019-02-02 140 -340
2 16 2019-02-03 150 -490
2 18 2019-02-11 160 -650
2 11 2019-02-12 180 -830
2 12 2019-02-12 190 -1020
2 13 2019-02-13 130 -1150
2 19 2019-02-17 120 -1270
2 20 2019-02-17 110 -1380
2 17 2019-03-08 170 -1550

(строк обработано: 20)


----------------------------------------------------------------------------------
Microsoft SQL Server 2017 (RTM-CU10) (KB4342123) - 14.0.3037.1 (X64)
Jul 27 2018 09:40:27
Copyright (C) 2017 Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: )

джойнить Int на varchar() .

$
0
0
Привет Всем,
есть необходимость джойнить две таблицы по ключу в одной из которых Int, в другой varchar() .

Если сейчас на 2016 разница, как соединять?

ON T1.NS = T2.N
ON CAST(T1.NS AS VARCHAR(MAX))= T2.N
ON CAST(T1.NS AS VARCHAR(10))= T2.N

Планы показывают одно и тоже.

IF OBJECT_ID('tempdb..#T1') IS NOT NULL 
	DROP TABLE #T1;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, NS = CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS VARCHAR(10))
INTO #T1
FROM D AS D1, D AS D2;
GO
ALTER TABLE #T1 ALTER COLUMN NS VARCHAR(10) NOT NULL; 
GO
ALTER TABLE #T1 ADD PRIMARY KEY CLUSTERED (NS) ;
GO
IF OBJECT_ID('tempdb..#T2') IS NOT NULL 
	DROP TABLE #T2;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
INTO #T2
FROM D AS D1, D AS D2
;
GO
ALTER TABLE #T2 ALTER COLUMN N INT NOT NULL; 
GO
ALTER TABLE #T2 ADD PRIMARY KEY CLUSTERED (N) ;
GO
SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON T1.NS = T2.N

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T1.NS AS VARCHAR(MAX))= T2.N

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T1.NS AS VARCHAR(10))= T2.N

Cannot connect.

$
0
0
На сервере подключаюсь к базе с помощью MSSMS и вылетает сообщение:

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

A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.) (Microsoft SQL Server, Error: 233)

Проблема с бэкапом

$
0
0
Попытался сделать бэкап из софта:

BACKUP DATABASE MyDB TO DISK = 'C:\Backups\MyDB.bak'


Сначало попробовал в студии - все отлично отработало.

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

Что это может быть?

Память Maximum Server < sum(Workspace) ?

$
0
0
Что происходит, когда приходит несколько запросов, требующих в сумме workspace memory больше, чем дано серверу? Превышающие доступную память ждут, не накладывая блокировки на данные?
BOL
Degree of Parallelism (Integer Data)
The amount of "workspace memory" in kilobytes that the query has been granted to perform operations involving hashing, sorts or create index operations. The memory will be acquired during execution as needed.

sp_send_dbmail недопустимый файл вложения

$
0
0
Всем добрый день.
Не могу сделать рассылку с прикреплением файлов:
Declare @filenames nvarchar(max)
Set @filenames = 'D:\DATA\DOC\DBS.jpg'
--Set @filenames = '\\DBS\CarryFiles\41714\№ 1319.pdf' через файлы из FileTable та же ошибка
EXEC msdb.dbo.sp_send_dbmail
	@recipients = 'test@test.ru',
	@subject = 'Тест рассылки с вложением',
	@body = 'Тест',
	@file_attachments = @filenames;

Получаю ошибку "Недопустимый файл вложения D:\DATA\DOC\DBS.jpg"
Без вложений рассылка работает без проблем.
Есть идеи в чем может быть проблема?

Удаленный сервер

$
0
0
Господа, добрый день.
Есть старенький, но очень добрый и хороший сервер MSSQL 2000 SP4. Работает на объекте очень хорошо и будет еще работать много лет. Уверен. И переходить на другой никто не планирует.
А теперь проблема...
Этот сервер находится в глобальной сети с IP 123.456.78.90 и естественно с портом 1433. Но этот порт внутренний.
Чтобы достучаться до него есть порт 99999. И вот, используя ЕМ я его успешно регистрирую сервер с адресом 123.456.78.90,9999 и очень хорошо к нему подключаюсь c логином и паролем 'sa' . Вижу все базы и все данные.
Здесь же я сделал sp_addlinkedserver @server=N'123.456.78.90,99999', @srvproduct=N'SQL Server'

А вот QA ничего не работает. Элементарный запрос select * from [123.456.78.90,99999].DB.dbo.tables1 не выполняется.
ОШИБКА: Сервер не обнаружен или отсутствует доступ.

Ткните меня куда-нибудь. Спасибо.

вызов процедуры для каждой записи

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

Если таблица с данными, в ней есть ID записи.

Вопрос в следующем.

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

Собственно вопрос, есть ли примеры как это можно сделать?

Проблема с созданием пользовательской функции, возвращающей таблицу.

$
0
0
Доброго времени суток, уважаемые коллеги!
Сразу пишу, что не смог найти решения на форумах, а сам второй день бьюсь.
Задача: упаковать скрипт в пользовательскую функцию, возвращающую таблицу. Раньше такого не делал. Потренировался на кошках – получается. Пробую упаковать свой скрипт – ругается:

Msg 156, Level 15, State 1, Procedure fnPatientsQwantity, Line 9
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure fnPatientsQwantity, Line 36
Incorrect syntax near ')'.

СРАЗУ ОГОВОРЮСЬ, ЧТО САМ СКРИПТ РАБОТАЕТ.
Или лыжи не те, или я… Есть сильное подозрение, что за простыми ошибочками, указанными выше, скрывается то, что в функцию я упаковываю скрипт, содержащий рекурсивный запрос.
Помогите!
*********************************************************************************
Сам скрипт:
*********************************************************************************
USE HospitalDb
GO

DECLARE @HospID AS INT
DECLARE @FLAG AS INT 

SET @HospID=1
SET @FLAG=1

IF @FLAG=0

	SELECT @HospID AS HospitalID, HospitalName, COUNT(P.PatientID) AS PatientsQwantity
	FROM SPRHospital AS S RIGHT JOIN Patients AS P
	ON S.HospitalID=P.HospitalID
	WHERE S.HospitalID=@HospID
	GROUP BY HospitalName

 ELSE 

	WITH RecCTE
	AS
	(
	SELECT S.HospitalID, S.HospitalName, S.ReportsTo
	FROM SPRHospital AS S
	WHERE S.HospitalID=@HospID
		UNION ALL
	SELECT S1.HospitalID, S1.HospitalName, S1.ReportsTo
	FROM RecCTE AS R JOIN
		 SPRHospital AS S1 ON R.HospitalID=S1.ReportsTO
	)
	SELECT R1.HospitalID, R1.HospitalName, COUNT(DISTINCT P.PatientID) AS PatientsQwantity
	FROM RecCTE AS R1 
	LEFT JOIN SPRHospital AS S2 ON R1.ReportsTO=S2.HospitalID
	LEFT JOIN Patients AS P ON R1.HospitalID=P.HospitalID
	GROUP BY R1.HospitalID, R1.HospitalName
	ORDER BY R1.HospitalID

*************************************************************************************
Скрипт по созданию функции:
*************************************************************************************
USE HospitalDb
GO

CREATE FUNCTION dbo.fnPatientsQwantity(@HospID AS INT, @FLAG AS INT=0)
	RETURNS TABLE 
	AS
	RETURN
(
IF @FLAG is NULL

	SELECT @HospID AS HospitalID, HospitalName, COUNT(P.PatientID) AS PatientsQwantity
	FROM SPRHospital AS S RIGHT JOIN Patients AS P
	ON S.HospitalID=P.HospitalID
	WHERE S.HospitalID=@HospID
	GROUP BY HospitalName

 ELSE 

	WITH RecCTE
	AS
	(
	SELECT S.HospitalID, S.HospitalName, S.ReportsTo
	FROM SPRHospital AS S
	WHERE S.HospitalID=@HospID
		UNION ALL
	SELECT S1.HospitalID, S1.HospitalName, S1.ReportsTo
	FROM RecCTE AS R JOIN
		 SPRHospital AS S1 ON R.HospitalID=S1.ReportsTO
	)
	SELECT R1.HospitalID, R1.HospitalName, COUNT(DISTINCT P.PatientID) AS PatientsQwantity
	FROM RecCTE AS R1 
	LEFT JOIN SPRHospital AS S2 ON R1.ReportsTO=S2.HospitalID
	LEFT JOIN Patients AS P ON R1.HospitalID=P.HospitalID
	GROUP BY R1.HospitalID, R1.HospitalName
	ORDER BY R1.HospitalID
	)
GO
******************************************************

Msg 156, Level 15, State 1, Procedure fnPatientsQwantity, Line 9
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure fnPatientsQwantity, Line 36
Incorrect syntax near ')'.

блокировка stored proc

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

Поведение try/catch в разных версиях SQL

$
0
0
есть несколько SQL серверов разных версий 2012 и 2014
на них одинаковые базы созданные по одному и тому же скрипту.
в каждой есть некая таблица log и хранимка типа
set xact_abort on
begin try
  <что-то делаем>
end try
begin catch
  insert into log 
end catch

при одной и той-же ситуации, когда в try возникает одна и та же (смоделировано) ошибка, в 2012 в таблице log ничего не появляется, в 2014 все нормально.
где грабли? куда копать?

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

$
0
0
на работе работаю с макросом совсем недавно.
Абсолютно ничего не умею
При перестроении отчета из экселя выдает ошибку.
как я могу ее исправить?

Программирование в MSSQL?

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

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

Есть таблица с продажами блюд и есть таблица прайса.

Таблица прайса:
id - id_dish - date_from - date_to

id_dish - id блюда
date_from - действует с
date_to - действует по



С таблицы продажи блюд по сути мне нужен только id блюда и кол-во дней продаж.
Select 
[id_dish], 
[Кол-во дней продаж],
[Кол-во дней доступных для продажи]
from sales_table 
where 
date_sale between '2019-01-01' and '2019-01-14'


Задача следующая:
Нужно в запросе вывести еще два значения кроме id блюда

1. Кол-во дней доступных для продажи блюда(в периоде может быть несколько прайсов с разными периодам, но как правило периоды не пересекаются)

2. Кол-во дней продажи блюд

Как программист я бы использовал for и перебирал даты но тут это явно не прокатит )

Получить ближайшее число отсутствующее в последовательности

$
0
0
Есть таблица с номерами Таблица(int Number)

Она содержит набор случайных чисел, скажем 1,2,3,4,5,7,9,12,13...

Как можно получить ближайшее отсутствующее число? В данном примере будет 6. Таблица может быть большой, скажем миллион записей

хитрое слияние данных

$
0
0
MSSQL2005. Есть две таблицы с одинаковой структурой, одна накопительная, другая текщая, куда пишется хронология изменения значений параметров за сутки.
create table #main ([id] int identity(1,1),[Param] int not null,[Value] int not null,[BegTime] datetime not null,[EndTime] datetime not null)
create table #today ([id] int identity(1,1),[Param] int not null,[Value] int not null,[BegTime] datetime not null,[EndTime] datetime not null)
insert into #main values
(1,1,'2019-02-12 00:00:00','2019-02-12 01:17:13'),
(2,1,'2019-02-12 00:00:00','2019-02-12 23:59:59'),
(1,3,'2019-02-12 01:19:38','2019-02-12 07:37:13'),
(1,1,'2019-02-12 07:58:21','2019-02-12 14:29:08'),
(1,3,'2019-02-12 14:35:19','2019-02-12 21:07:41'),
(1,1,'2019-02-12 21:08:02','2019-02-12 23:55:57')
insert into #today values
(1,1,'2019-02-13 00:03:12','2019-02-13 03:24:49'),
(2,1,'2019-02-13 00:01:17','2019-02-13 23:58:47'),
(1,3,'2019-02-13 03:27:07','2019-02-13 07:15:51'),
(1,1,'2019-02-13 07:20:17','2019-02-13 23:57:41')

Нужно выполнить слияние данных таким образом, чтоб в таблице #main обновились записи (расширился EndTime), если значение соответствующего параметра не менялось в таблице #today, остальные добавились:
Param Value BegTime             EndTime
----- ----- ------------------- -------------------
1     1     2019-02-12 00:00:00 2019-02-12 01:17:13
2     1     2019-02-12 00:00:00 2019-02-13 23:58:47
1     3     2019-02-12 01:19:38 2019-02-12 07:37:13
1     1     2019-02-12 07:58:21 2019-02-12 14:29:08
1     3     2019-02-12 14:35:19 2019-02-12 21:07:41
1     1     2019-02-12 21:08:02 2019-02-13 03:24:49
1     3     2019-02-13 03:27:07 2019-02-13 07:15:51
1     1     2019-02-13 07:20:17 2019-02-13 23:57:41

Как в строке найти определенную позицию?

$
0
0
Доброго дня!
Помогите, пожалуйста, с написанием запроса (если возможно, то одним селектом). Задача:
Имеется строка '916-123-45-67 (Иван Иванович)'. Номер телефона может быть записан в произвольном формате. Мне нужно отделить цифры (это я сделала) и текст после цифр. То есть, как я полагаю, нужно найти позицию последней цифры в строке.
Но может и другой алгоритм какой есть...?
Viewing all 7251 articles
Browse latest View live