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

MS SQL 2016. Функция возвращающая количество строк в любой таблице (параметр)

$
0
0
Доброго времени суток. Понадобилось мне разработать функцию, которая бы в качестве параметра принимала имя таблицы и возвращала количество записей этой таблицы. Подразумевается, что таблица существует.
Нижеприведеный код система пропускает.
crete function [dbo].[fnCountRows] (@tblName varchar(max)) returns int as 
begin
  declare @res int = 0
  declare @Sql nvarchar(max) = 'select @CountRowsOut = count(*) from ' + @tblName + ' (nolock)'
  exec sp_executesql @Sql, N'@CountLinesOut int output', @CountRowsOut = @res Output
  return @res
end

Однако при запуске :
declare @c int = dbo.fnCountRows('MyTable')
print @c

ругается:
Only functions and some extended stored procedures can be executed from within a function.

Как обойти обойти это ограничение?
Понятно, что можно написать хранимую процедуру, которая возвращает количество строк во втором параметре с признаком Output

Может кому известны иные варианты?

Заранее благодарен за ответы

Помощь в написании запроса

$
0
0
Добрый день.
Есть таблица с id сотрудника и его навыками(скиллами).
Нужно написать запрос который по каждому сотруднику выводит кол-во других сотрудников у которых есть такие же навыки как у него.

create table #x ( id_user int , skill varchar(255) )
Insert #x
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c' union all
select 3,'x' union all
select 4,'a' union all
select 4,'b' union all
select 4,'c' union all
select 4,'h' union all
select 5,'h'



Результат :
1 - 2
2 - 2
3 - 0
4 - 0
5 - 1

т.е
у сотрудника с id 1 скиллы a,b,с , такие скиллы есть у сотрудников 2 и 4 = 2
у сотрудника с id 2 скиллы a,b,с , такие скиллы есть у сотрудников 1 и 4 = 2
у сотрудника с id 3 скилл х , такого скилла ни у кого нет = 0
у сотрудника с id 4 скиллы a,b,с,h , такого набора ни у кого нет = 0
у сотрудника с id 5 скилл h , такой есть у сотрудника 4 = 1


Вроде бы должно быть не сложно, но что то я запутался как написать

Не работает операция like в запросе

$
0
0
Запрос такой:

select t.tapid, isnull(m.family,'') as family, isnull(m.name,'') as name, isnull(m.ot,'') ot, convert(date, isnull(m.date_bd, '01.01.1901')) as date_db, isnull(se.servicemedicalcode,'') as scode,
substring(rtrim(ltrim(isnull(se.ServiceMedicalName,''))),1,250) as sName, isnull(mkb.ds, '') as ds, substring(ltrim(rtrim(isnull(d.DepartmentName,''))),1,30) as DName, isnull(do.FAM_V, '') as fam_v, convert(date, isnull(s.DATE_P,'01.01.1901')) as date_p, substring(isnull(p.NAME,''),1,3) as profit
from r_hlt_TAP as t
inner join r_hlt_SMTAP as s on s.rf_TAPID=t.tapid
inner join r_hlt_mkab as m on m.MKABID=t.rf_MKABID
inner join r_oms_department as d on d.DepartmentId=s.rf_DepartmentID
left join r_hlt_LPUDoctor as do on do.LPUDoctorID=s.rf_LPUDoctorID
inner join r_oms_servicemedical as se on se.servicemedicalId=s.rf_omsservicemedicalId
left join r_oms_kl_ProfitType as p on p.kl_ProfitTypeID=t.rf_kl_ProfitTypeID
left join r_oms_mkb as mkb on mkb.mkbid=s.rf_MKBID
where ((convert (date, s.DATE_P)>@d2 or convert(date,s.date_p)<convert(date,@PrevDate)) and convert(date,t.DateClose)>=@d1 and convert(date,t.DateClose)<=@d2)
and se.servicemedicalname like 'D%'
and t.IsClosed=1


Не выдает ничего

А Запрос в таком виде выдает много строчек, где se.servicemedicalname начинается именно на символ D
select t.tapid, isnull(m.family,'') as family, isnull(m.name,'') as name, isnull(m.ot,'') ot, convert(date, isnull(m.date_bd, '01.01.1901')) as date_db, isnull(se.servicemedicalcode,'') as scode,
substring(rtrim(ltrim(isnull(se.ServiceMedicalName,''))),1,250) as sName, isnull(mkb.ds, '') as ds, substring(ltrim(rtrim(isnull(d.DepartmentName,''))),1,30) as DName, isnull(do.FAM_V, '') as fam_v, convert(date, isnull(s.DATE_P,'01.01.1901')) as date_p, substring(isnull(p.NAME,''),1,3) as profit
from r_hlt_TAP as t
inner join r_hlt_SMTAP as s on s.rf_TAPID=t.tapid
inner join r_hlt_mkab as m on m.MKABID=t.rf_MKABID
inner join r_oms_department as d on d.DepartmentId=s.rf_DepartmentID
left join r_hlt_LPUDoctor as do on do.LPUDoctorID=s.rf_LPUDoctorID
inner join r_oms_servicemedical as se on se.servicemedicalId=s.rf_omsservicemedicalId
left join r_oms_kl_ProfitType as p on p.kl_ProfitTypeID=t.rf_kl_ProfitTypeID
left join r_oms_mkb as mkb on mkb.mkbid=s.rf_MKBID
where ((convert (date, s.DATE_P)>@d2 or convert(date,s.date_p)<convert(date,@PrevDate)) and convert(date,t.DateClose)>=@d1 and convert(date,t.DateClose)<=@d2)
and se.servicemedicalname like '%'
and t.IsClosed=1


Где искать причину?

добавление полей в существующую БД MS SQL из excel

$
0
0
Здравствуйте, уважаемые форумчане! Столкнулся с проблемой добавления полей в уже заполненную БД
представим, что есть БД с полями A, B, C заполненные на 1000 строк

нужно добавить поле D с 200 заполненными ячейками

первое, что пришло на ум - это создание в БД поля D,
в MS SQL Managment использовал команду Задачи - импорт данных из таблицы эксель

после импорта, в поле D первые 1000 ячеек - нулевые, с 1000 - 1200 заполнены значениями из поля D

если более простой механизм для перегонки инфы из экселя в БД MS SQL?
как мне запросом удалить первые 1000 пустых ячеек из поля D(поднять 200 заполненных значений, к первой строке) и не удалив при этом всю строку, т.к. информация из полей A, B, C - естественно нужна?

Отобрать по критерию

$
0
0
Может для кого то вопрос покажется слишком простым, но все же...

Есть таблица с данными в которой есть текст с одной точкой и с двумя
...
1.1
1.2
1.3
1.11
1.1.1
1.1.5
1.2.2
1.4


Нужно отобрать только записи, в которых содержится две точки

...
1.1.1
1.1.5
1.2.2



Спасибо, кто сможет помочь.

Error: 50000 Severity: 19

$
0
0
Добрый день.
На сиквеле создал джоб с выполнением следующих шагов:
1. update statistics
2. freeproccache
3. reorganizing/rebuilding index

Джоб выполняется каждую ночь, но периодически завершается с ошибкой на 3м шаге.
Ошибка следующего характера:
"Error: 50000 Severity: 19 State: 56 Transaction (Process ID 77) was deadlocked on
lock resources with another process and has been chosen as the deadlock victim.
Rerun the transaction."

Не подскажите, с чем это может быть связано?

Запрос на получение непрерывных последовательностей

$
0
0
ID integer Идентификатор записи
DayID date Дата
ArtID integer Идентификатор товарной позиции
CntrID integer Идентификатор контрагента склада
EndQnty decimal(16, 3) Остаток на складе
1. Необходимо написать запрос, который покажет, сколько непрерывно дней у товарной позиции нет отгрузок со склада на каждую дату.
Источник данных:
• dbo.tTestTable1
Вывести следующие поля:
• Дата
• Идентификатор контрагента склада
• Идентификатор товарной позиции
• Остаток на складе
• Количество дней без отгрузок

Подскажите как можно реализовать данный запрос, единственное до чего додумался
select ArtID , abs (DATEDIFF(day,max(DayID),min(DayID))) from Table_1 group by ArtID
но этого не достаточно

что не так?

$
0
0
Скажите пожалуйста,


SELECT 
a.UniqueId,
a.StartDate,
a.EndDate,
b.dats
FROM dbo.Appointments a
left join (select id,dats from dbo.f_datsIntervalGant(a.UniqueId,a.StartDate,a.EndDate)) b on a.UniqueId=b.id


Msg 4104, Level 16, State 1, Line 7
Не удалось привязать составной идентификатор "a.UniqueId".
Msg 4104, Level 16, State 1, Line 7
Не удалось привязать составной идентификатор "a.StartDate".
Msg 4104, Level 16, State 1, Line 7
Не удалось привязать составной идентификатор "a.EndDate".

Заранее благодарен.

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

$
0
0
Здравствуйте!
Есть две таблицы:
1. id a1,a2,a3,a4,f
2. id b1,b2,b3,f
они связаны по id- идентификатор первой таблицы. f- поле типа int для определения актуальности записи
При каких либо изменениях запись инсертом копируется в таблицу с новым id и изменениями, а старая запись отправляется в архив с f=0
Возникла необходимость поменять значения в нескольких записях(здесь проблем нет), а вот как "отправить архив" из записи.
Как думал я:
1. копировать записи с первой таблицы в неё же по условию с f=2. Тут создаются новые id идентификатором-сделал
2. делать в них изменения-сделал

а тут подзавис, помогите чем можЫте)
3. затем копировать связанные записи из таблицы 2 в неё же с новым ID из таблицы 1
4. "отправить в архив" записи в обеих таблицах(f=0) и в созданных поменять f=1

USE base
DECLARE @STR NVARCHAR(MAX) SET @STR ='111'
--СОЗДАЮ НОВЫЕ ЗАПИСИ В ТАБЛИЦЕ 1
/*INSERT INTO Table1 (a1,a2,a2,a3,a4,f)
SELECT a1,a2,a2,a3,a4,'2'
FROM Book WHERE a1 LIKE '%'+@STR+'%'*/

Поиск объекта на серверах по имени

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

Одну ошибку в ней уже нашел и поправил.

Осталась еще одна, а именно:

Код процедуры выполняется в SSMS для группы серверов. Так как в группе серверов есть сервера с разными Collation, то символы кириллицы в отдельных базах могут выводится вопросиками. Соответственно и объект обозванный по русски найти в них не найдется.

Соответственно и вопрос - возможно ли как-то исправить это дело?

Или кто знает другой способ реализации поиска объектов, применимых на серверах начиная с версии SQL 2005?

Поиск объекта на серверах по имени

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

Одну ошибку в ней уже нашел и поправил.

Осталась еще одна, а именно:

Код процедуры выполняется в SSMS для группы серверов. Так как в группе серверов есть сервера с разными Collation, то символы кириллицы в отдельных базах могут выводится вопросиками. Соответственно и объект обозванный по русски найти в них не найдется.

Соответственно и вопрос - возможно ли как-то исправить это дело?

Или кто знает другой способ реализации поиска объектов, применимых на серверах начиная с версии SQL 2005?

на сервере встроенная функция t-sql sp_getapplock отрабатывает корректно,из 1С нет

$
0
0
на сервере встроенная функция t-sql EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';
отрабатывает нормально
из 1С 8 нет

пСтрСоед = "driver={SQL Server};"+"server="+СокрЛП("test1c")+";"+"uid="+СокрЛП(Login)+"; "+"pwd="+СокрЛП(Password)+";"+"Database="+СокрЛП("SMP_2018");
 
GlobalConnection = Новый COMОбъект("ADODB.Connection"); 
GlobalConnection.Provider = "SQLOLEDB"; 
GlobalConnection.ConnectionTimeout = 15; 
GlobalConnection.CommandTimeOut    = 30; 
GlobalConnection.ConnectionString = пСтрСоед; 
GlobalConnection.Open();
GlobalCommand = Новый COMОбъект("ADODB.Command"); 
GlobalCommand.ActiveConnection = GlobalConnection; 
GlobalCommand.CommandType = 1;  ////ставил типы 1, 4,8
GlobalCommand.prepared = "true";
GlobalCommand.namedParameters   = "true";

///Здесь пытаюсь вызвать функцию

GlobalCommand.CommandText = "sp_getapplock"; 

////и пытаюсь передать в неё параметр 

GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 3, 16, )); 
GlobalCommand.Parameters(0).value = "exclusive";
GlobalCommand.Execute(); 

///пишет
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.

///пробую сделать по другому

GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@DbPrincipal", 200, 3, 16,"dbo")); 
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@Resource", 200, 1, 12, "SC5197")); 
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16, "exclusive")); 
GlobalCommand.Execute(); 
///пишет
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.


///и даже вот так 
СтрокаЗапроса =   "BEGIN TRAN;EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';";
GlobalCommand.CommandText = СтрокаЗапроса;
GlobalCommand.Execute(); 
///ошибок не выдает но и результата блокировки тоже нет


//////третий параметр менял с 0 до 4 не помогает
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16,"exclusive")); 

подскажите пожалуйста как правильно передать LockMode

log shipping на azure с серверa

$
0
0
Добрый день, помогите пожалуйста, нужен совет, наша фирма хочет резервный сервер перенести на azure, а репликация будет log shipping. Есть ли встроенные инструменты SQL server-a, которые делают лог шиппинг? и как лучше настроить лог шиппинг()? Работаем SQL server 2016 enterprise.

извлечение данных по дате из внешнего файла

$
0
0
Подскажите, пожалуйста, есть файл C:/date.txt , там хранится всего одна дата, например 02-08-2018
как мне в sql выбрать те данные, которые больше этой даты
если я так пропишу запрос
SELECT Dt, CustomerName, ItemRelation, SaleCount, 
               DocumentNum, DocumentYear, IsPromo
FROM [Action].dbo. mytab1 WHERE Dt > C:/date.txt

ответ
Ошибка преобразования даты или времени из символьной строки.
Как мне сделать именно условие > C:/date.txt, а не >02-08-2018?

Поиск по индексу вместо скана. Почему?

$
0
0
Коллеги, приветствую!
Никак не могу разобраться в логике работы оптимизатора (MS SQL 2014). Вроде как, если я задаю условие под которое подходит большая часть строк таблицы, тогда у меня должен выбираться план со сканированием, т.к. это должно быть быстрее. Но на практике выбирается план с поиском по индексу.
Запрос:
exec sp_executesql N'INSERT INTO #tt1 WITH(TABLOCK) (_Q_001_F_000) 
SELECT
T1._Fld1247
FROM dbo._Reference938 T1
WHERE (T1._Fld1247 = @P1)',N'@P1 numeric(10)',100


В таблице 150 тыс. записей, в поле _Fld1247 всего 10 значений которые равны 1, остальные равны 100. По идее в текущем запросе оптимизатор должен был бы выбрать скан индекса ведь я возвращаю почти всю таблицу, но идет Index Seek.

Почему так происходит?
Заранее спасибо за ответы.

Кол-во используемых процессоров в SQL

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

У меня MS SQL 2016 работает в VM под Hyper-V.

Процессор на физическом сервере Xeon E5-2620v4 8 ядер 16 потоков.

Я выделил 10 vCPU под эту виртуалку и фиксированный обьём памяти 20480Гб из них от 8192 до 16384 под SQL и остальное под агент сервера 1С 8.3 х64.

Ночью выполняется Maintenance Plan, который выглядит следующим образом:

https://yadi.sk/i/hzNLaFUL3ZrV2Z

В заданиях Check Database Integrity и Rebuild Index указал maxdop = 4. Замерял скорость выполнения заданий с шагом в 2 от 0 до 1.
Разница была в пределах 10 минут относительно 2х часов выполнения на значении = 4.

Update Statistics с параметром column statistics only.

Собственно проблема в том, что по системе мониторинга в момент перестроения индексов полностью загружен только 1 CPU и при этом почему-то 8й: https://yadi.sk/i/180qwHOr3ZrVHj

Проверил, что SQL использует все "ядра":

SELECT scheduler_id, cpu_id, status, is_online FROM sys.dm_os_schedulers 
GO


Результат https://yadi.sk/i/WTOFHgTH3ZrVRK

Подскажите, почему так происходит и можно ли это как-то исправить?

Заранее благодарен за ответты.

Storage problem in Server

$
0
0
Hi,
I have a website named Advisorymandi.com, from last 3 years I used SQL server for my database. My experience was very good with SQL Server but last few months I'm facing some issue from server like - Server not responding.
someone help me please to resolve it.
Thanks

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

$
0
0
Добрый день.
Есть таблица с id и его значением.
Нужно написать запрос, который по каждому id который имеет значение 0 и 1 выводил только значение 0.

create table #z (id int, qua int)
Insert #z
select 1, 0 union all
select 1, 1 union all
select 2, 0 union all
select 3, 1 union all
select 4, 1 union all
select 4, 0 union all
select 5, 1

Т.е. должно получиться:
1 - 0
2 - 0
3 - 1
4 - 0
5 - 1

Индексированная вьюшка

$
0
0
Есть табличка типа примерно такой структуры

CREATE TABLE ds2(
	[id] [INT] IDENTITY(1,1) NOT NULL,
	[idschet] [INT] NOT NULL,
	[idcase] [INT] NOT NULL,
	[DS2] [VARCHAR](10) NOT NULL,
 CONSTRAINT [PK.ds2] PRIMARY KEY NONCLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Хочется сделать индексированную вьюшку типа idschet, idcase, (составная строка всех значений DS2) через запятую для пары значений idschet и idcase

Саму вьюшку WITH SCHEMABINDING сделать проблемы нет, проблема при попытке создать кластерный индекс на эту вьюшку, так как строку собираю подзапросом на основе XML, и кластеризованный индекс соответственно создать не дает. Можно как-то переделать запрос так чтобы была возможность создать необходимый мне кластерный индекс?

Помощь с запросом

$
0
0
Ребят помогите с запросом и связью двух таблиц.
Картинка с другого сайта.

Картинка с другого сайта.
Есть две таблицы, Table1 и Table2, приход и расход. У каждой записи есть номер, наименование и дата записи. Мне нужно чтобы в другую таблицу или вьюху, в одну строку по номеру и дате выводилась сумма прихода и расхода. Например сумма прихода и расхода по номеру 10 и дате за 3 августа. Если появляются записи за 4 августа, появляется новая строчка с суммированием. Номера могут меняться, т.е 10 это не постоянное значение.
Подскажите можно ли сделать такую выборку, если да то как?
Пример на скриншоте:
Картинка с другого сайта.
Viewing all 7251 articles
Browse latest View live