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

Использование индексов

$
0
0
На просторах инета нашёл запрос, который позволяет смотреть использование индексов с момента запуска ms sql

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 
and user_seeks=0 and user_scans=0 and user_lookups=0 
--and user_updates=0
order by [OBJECT NAME]




Запрос выдал

(825 rows affected)



Сервер стартовал

sqlserver_start_time
-----------------------
2019-04-04 22:47:01.867



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

Удалить часть данных из xml

$
0
0
добрый день.
Помогите пожалуйста с запросом.

Есть xml вида
<Заголовок>
	<Данные01>Инфо</Данные01>
	<Данные02>Инфо</Данные02>
	<Данные03>Инфо</Данные03>
	<Данные04>Инфо</Данные04>
	<Ветка01>
		<Данные01>Инфо</Данные01>
		<Данные01>Инфо</Данные01>
		<Ветка02>
			<Данные02>Инфо</Данные02>
		</Ветка02>
	</Ветка01>
	<Ветка03>Инфо</Ветка03>
	<Ветка04>
		<Ветка05>
			<Данные01>Инфо в рублях</Данные01>
			<Валюта>643</Валюта>
		</Ветка05>
		<Ветка05>
			<Данные01>Инфо в долларах</Данные01>
			<Валюта>840</Валюта>
		</Ветка05>
		<Ветка05>
			<Данные01>Инфо в рублях</Данные01>
			<Валюта>643</Валюта>
		</Ветка05>
		<Ветка05>
			<Данные01>Инфо в рублях</Данные01>
			<Валюта>643</Валюта>
		</Ветка05>
	</Ветка04>
</Заголовок>


Необходимо из него удалить данные /Заголовок/Ветка04/Ветка05/Валюта=643

т.е. на выходе нужен xml
<Заголовок>
	<Данные01>Инфо</Данные01>
	<Данные02>Инфо</Данные02>
	<Данные03>Инфо</Данные03>
	<Данные04>Инфо</Данные04>
	<Ветка01>
		<Данные01>Инфо</Данные01>
		<Данные01>Инфо</Данные01>
		<Ветка02>
			<Данные02>Инфо</Данные02>
		</Ветка02>
	</Ветка01>
	<Ветка03>Инфо</Ветка03>
	<Ветка04>
		<Ветка05>
			<Данные01>Инфо в долларах</Данные01>
			<Валюта>840</Валюта>
		</Ветка05>
	</Ветка04>
</Заголовок>

Зеркалирование как тул для переезда

$
0
0
Предстоит организовать перенос баз на другую машину с наименьшим временем в оффлайне.
Есть идея использовать зеркалирование для синхронизации баз перед переключением.

Однако:
На старой машине: SQL2008, 64бит.
На новой машине: SQL2008R2, 64бит.

Насколько реально/опасно использовать зерказирование между SQL2008 и SQL2008R2?
Версии всё таки не одинаковые.

Зеркалирование без контроллера домена

$
0
0
Иногда бывает, что контролле домена недоступен.
В этом случае класическое зеркалирование перестаёт работать.

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

Или побочные эффекты могут принести больше проблем чем выигрыша?

Вывод значений двух таблиц в общую таблицу

$
0
0
Есть таблица клиента:

Create table Klient
(
	nomer_klienta int not Null Primary Key ,
	familia varchar(20),
	imya varchar(20),
	otchestvo varchar(20)
);


Таблица материалов (песчаный замок, например, каменная плитка)

Create table Materials
(	
	Kod_materiala int not Null Primary Key,
	Kod_Type_materiala int not Null,
	Nazvanie_materiala varchar(20) not Null,
	CONSTRAINT FK_Materials_Type_materiala 
		FOREIGN KEY (Kod_type_materiala) REFERENCES Type_materiala(Kod_type_materiala)
);


Таблица типов материала (тип материала может быть или камень или песок)

Create table Type_materiala 
(
	Kod_type_materiala int not Null Primary Key,
	Nazvanie_type_materiala varchar(20) not Null default 'pesok',
	UNIQUE (Nazvanie_type_materiala ),
	CHECK (Nazvanie_type_materiala IN ('pesok', 'kamen'))
);


и таблица сделок с клиентами

Create table Sdelki
(
	Kod_sdelki int not Null Primary Key,
	nomer_klienta int not Null,
	CONSTRAINT FK_Sdelki_Klient
		FOREIGN KEY (nomer_klienta ) REFERENCES Klient(nomer_klienta ),
	kolichestvo real CHECK (kolichestvo>0),

	Kod_materiala int not Null,
	CONSTRAINT FK_Sdelki_Materials
		FOREIGN KEY (Kod_materiala ) REFERENCES Materials(Kod_materiala ),

	Kod_type_materiala int not Null,
	CONSTRAINT FK_Sdelki_Kod_type_materiala 
		FOREIGN KEY (Kod_type_materiala ) REFERENCES Materials(Kod_type_materiala ),

	napravlenie_sdelki varchar(10) not Null default 'long' 
		CHECK (napravlenie_sdelki IN ('long', 'short')),
	zena_otkrytiya money CHECK (zena_otkrytiya>0),
	zena_zakrytiya money CHECK (zena_zakrytiya>0),
	pribyl as 
		case 
			when napravlenie_sdelki = 'long' then 
				(zena_zakrytiya-zena_otkrytiya)*kolichestvo
				else (zena_otkrytiya-zena_zakrytiya)*kolichestvo
		end
);


Как сделать, чтобы создалась одна таблица с двумя колонками ('pesok', 'kamen'), в которые записывались 3 самых прибыльных песочных материала и топ 3 каменных соответственно у такого-то клиента??

Сломал голову, один бред получается
SELECT TOP(3) familia, Nazvanie_type_materiala as 'pesok', Nazvanie_type_materiala as 'kamen', pribyl FROM Sdelki
inner join Materials ON Sdelki.Kod_materiala = Materials.Kod_materiala
inner join Klient ON Sdelki.nomer_klienta = Klient.nomer_klienta
inner join Type_materiala ON Sdelki.Kod_type_materiala = Type_materiala.Kod_type_materiala
ORDER BY pribyl DESC

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

Буду очень признателен за помощь

Удаление и Обновление данных в столбце.

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

Задача:

есть таблица, необходимо во всех строках столбца "Telephone" удалить все символы и оставить только цифры, после чего, измененные данные сохранить/обновить в данном столбце ("Telephone").

Для удаления всех ненужных символов использую ниже приведенную функцию.

CREATE FUNCTION [dbo].[StripNonNumerics]  (@Temp varchar(255))
RETURNS varchar(255)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
END


Она отлично справляется со своей задачей, это видно когда применяешь эту функцию и выводишь запрос.

SELECT Telephone, dbo.StripNonNumerics(Telephone) AS Telephone_Change FROM cust 


[img=]

Но как, применяя эту функцию, обновить/сохранить полученные данные в столбце Telephone, которые видны в альясе Telephone_Change? Возможно есть другие альтернативные решения. Буду благодарен за помощь в решении данного вопроса.

Удаление и Обновление данных в столбце.

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

Задача:

есть таблица, необходимо во всех строках столбца "Telephone" удалить все символы и оставить только цифры, после чего, измененные данные сохранить/обновить в данном столбце ("Telephone").

Для удаления всех ненужных символов использую ниже приведенную функцию.

CREATE FUNCTION [dbo].[StripNonNumerics]  (@Temp varchar(255))
RETURNS varchar(255)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
END


Она отлично справляется со своей задачей, это видно когда применяешь эту функцию и выводишь запрос.

SELECT Telephone, dbo.StripNonNumerics(Telephone) AS Telephone_Change FROM cust 


[img=]

Но как, применяя эту функцию, обновить/сохранить полученные данные в столбце Telephone, которые видны в альясе Telephone_Change? Возможно есть другие альтернативные решения. Буду благодарен за помощь в решении данного вопроса.

Удаление и Обновление данных в столбце.

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

Задача:

есть таблица, необходимо во всех строках столбца "Telephone" удалить все символы и оставить только цифры, после чего, измененные данные сохранить/обновить в данном столбце ("Telephone").

Для удаления всех ненужных символов использую ниже приведенную функцию.

CREATE FUNCTION [dbo].[StripNonNumerics]  (@Temp varchar(255))
RETURNS varchar(255)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
END


Она отлично справляется со своей задачей, это видно когда применяешь эту функцию и выводишь запрос.

SELECT Telephone, dbo.StripNonNumerics(Telephone) AS Telephone_Change FROM cust 


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

Но как, применяя эту функцию, обновить/сохранить полученные данные в столбце Telephone, которые видны в альясе Telephone_Change? Возможно есть другие альтернативные решения. Буду благодарен за помощь в решении данного вопроса.

Удаление и Обновление данных в столбце.

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

Задача:

есть таблица, необходимо во всех строках столбца "Telephone" удалить все символы и оставить только цифры, после чего, измененные данные сохранить/обновить в данном столбце ("Telephone").

Для удаления всех ненужных символов использую ниже приведенную функцию.

CREATE FUNCTION [dbo].[StripNonNumerics]  (@Temp varchar(255))
RETURNS varchar(255)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
END


Она отлично справляется со своей задачей, это видно когда применяешь эту функцию и выводишь запрос.

SELECT Telephone, dbo.StripNonNumerics(Telephone) AS Telephone_Change FROM cust 


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

Но как, применяя эту функцию, обновить/сохранить полученные данные в столбце Telephone, которые видны в альясе Telephone_Change? Возможно есть другие альтернативные решения. Буду благодарен за помощь в решении данного вопроса.

Удаление и Обновление данных в столбце.

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

Задача:

есть таблица, необходимо во всех строках столбца "Telephone" удалить все символы и оставить только цифры, после чего, измененные данные сохранить/обновить в данном столбце ("Telephone").

Для удаления всех ненужных символов использую ниже приведенную функцию.

CREATE FUNCTION [dbo].[StripNonNumerics]  (@Temp varchar(255))
RETURNS varchar(255)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^0-9]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
END


Она отлично справляется со своей задачей, это видно когда применяешь эту функцию и выводишь запрос. Но как, применяя эту функцию, обновить/сохранить полученные данные в столбце Telephone, которые видны в альясе Telephone_Change? Возможно есть другие альтернативные решения. Буду благодарен за помощь в решении данного вопроса.


SELECT Telephone, dbo.StripNonNumerics(Telephone) AS Telephone_Change FROM cust 

Перенос процесса.

$
0
0
Коллеги, добрый вечер.

Есть идея перенести все банковские процессы и реализовать их ПОЛНОСТЬЮ посредством dtsx пакетов с отказом от процедур. В данный момент базу обслуживают процедуры, немного dtsx пакетов, однако в VS пакет представляет собой этапы с однойменными процедурами, ссылающиеся на последние.
Вопрос: 1) возможно ли перенести обслуживание всех процессов посредством SSIS пакетов?
2) возможно ли почти полностью отказаться от процедурной части, которая в данный момент эксплуатируется?
3) какие положительные моменты появятся в случае успешной реорганизации?
4) какие отрицательные моменты появятся в случае реализации?

С уажением
ваш коллега.

вопрос по проектированию БД

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

Поделитесь, пож-та, практикой.

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

Собственно, вопрос, как хранить такие данные:

- делать одну огромную БД и в ней много схем? Видятся возможные проблемы с backup/restore
- делать много отдельных БД, например Источник1.Исходные_данные, Источник2.Преобразованные данные? Видятся возможные проблемы с межбазовым взаимодействием.

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

В общем, кто что посоветует?

Загрузка сложного xml в таблицу sql server

$
0
0
Всем привет. Возникли затруднения при загрузке xml (во вложении) в таблицу sql server. Ниже приведена моя реализация. Подскажите, пожалуйста, что здесь исправить и какой метод реализации лучше использовать с данным xml.

declare @hdoc int,
@xml varchar(1000)
set @xml=
N'*листинг xml*'
exec sp_xml_preparedocument @hdoc OUTPUT, @xml
select *
from
openxml(@hdoc,'/document',1)
with(
a nvarchar(20) '',
b nvarchar(20) '') X
exec sp_xml_removedocument @hdoc

Ошибки при выводе
The XML parse error 0xc00ce55e occurred on line number 13, near the XML text " <dr6666shel:part_numbe".
Msg 6602, Level 16, State 2, Procedure sp_xml_preparedocument, Line 1 [Batch Start Line 0]
The error description is 'Element was not closed.'.
Msg 8179, Level 16, State 5, Line 1042
Could not find prepared statement with handle 0.
Msg 6607, Level 16, State 3, Procedure sp_xml_removedocument, Line 1 [Batch Start Line 0]
sp_xml_removedocument: The value supplied for parameter number 1 is invalid.

Не уверен что правильно понял задание, и не уверен что запрос правильный=)

$
0
0
Вот здесь датасет и запрос(снипет)

Задание -
Посчитать суммы выданных займов по Региональным подразделениям за каждую бизнес-неделю в период с 38 по 40 бизнес-неделю 2011 года включительно. Упорядочить по наименованию Регионального подразделения, бизнес-неделе.
select 
trd.name as "Региональное подразделение",
bc.bc_year as "Год",
bc.week as "Неделя",
sum(d.dl_sum) as "Сумма выданных займов",
count(d.dl_id) as "Кол-во займов"
from deal as d
join business_calendar as bc
on (bc.date_begin < d.dl_valutation_date or bc.date_begin = d.dl_valutation_date)
and (dateadd(day, 6, bc.date_begin) > d.dl_valutation_date or dateadd(day, 6, bc.date_begin) = d.dl_valutation_date)
join territory as t on t.id = d.dl_territory_id
join territory as trd on t.parent_id = trd.id
where bc.week in (38,39,40) 
group by trd.name,bc.bc_year, bc.week
order by trd.name, bc.week asc

Ошибка при формировании таблицы

$
0
0
Прошу не судить строго.
Самостоятельно прокачиваю SQL.


Есть 4 таблицы
1.Табл TRANSACT: колонки item_id / amount
2. табл PRICE: item_id
3. табл lu_item: group_id/ item_id
4. GR : group_id/ group_name
Хочу получить 2 колонки: group_name и Vmr

Пишу скрипт:

SELECT
GR.group_name
(T.amount-PRICE.cost)*100/T.amount Vmr
FROM GR
JOIN lu_item ON GR.group_id=lu_item.group_id
JOIN PRICE ON lu_item.item_id=PRICE.item_id
JOIN TRANSACT T ON PRICE.item_id=T.item_id
ORDER BY Vmr DESC
-------
возвращает
#1370 - execute command denied to user '…..' for routine 'GR.group_name'

Подскажите, пож, где ошибка?

запрос к таблице(count, sum)

$
0
0
всем привет!

у меня есть такая таблица:
автор
create table main (x date, y int, z char);
insert into main values('20190301', 3, 'c');
insert into main values('20190310', 7, 'a');
insert into main values('20190320', 9, 'a');
insert into main values('20190402', 11, 'a');
insert into main values('20190411', 4, 'a');
insert into main values('20190411', 5, 'a');
insert into main values('20190415', 5, 'b');
insert into main values('20190421', 9, 'a');
insert into main values('20190421', 10, 'b');
insert into main values('20190421', 5, 'a');
insert into main values('20190428', 15, 'a');
insert into main values('20190501', 7, 'b');

select x,y,z from main;


есть к ней параметры на вход: две даты(20190401, 20190430) и значение 'a'
по этим параметрам хотелось бы написать селект к таблице, который бы вывел по выборке:
1. количество дней, по которым есть записи(параметр x): 4
2. количество записей: 8
3. сумму параметра z по всем записям: 65
4. последний день, в который есть запись(параметр x): '20190428'

p.s. задача выглядит просто, но я не совсем понимаю, эта задача сложная или простая(в случае, если сложная, не знаю, насколько правильно ее сюда выкладывать и просить её решить), но сам с ней сижу сегодня полдня, у меня не получается пока ее сделать.

Изменение значений полей

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

UPDATE k_sotr2 SET Шифр = Шифр + len(Отчество)
UPDATE k_sotr2 SET Шифр = Шифр - Код_должности
where (datediff(day,ДатаРождения,CURRENT_TIMESTAMP)) > (select avg((datediff(day,ДатаРождения,CURRENT_TIMESTAMP))))


а как уменьшить значение даты рождения сотрудника на количество дней, соответствующих коду должности?

Посчитать проценты после группировки для каждой группы от суммы всех групп

$
0
0
Имеется таблица с сгруппированными данными.
Нужно посчитать процент каждой группы от суммы всех групп.
есть ограничения
1. Сделать все это одним запросом.
2. Подключить такую же таблицу, но агрегированную по всем группам (чтобы получить сумму всех) нельзя.

Что-то пару часов ломаю голову, но решения пока не вижу.
Исходная таблица
Name Value
Ivan100
Vlad150
Mark250


Хочется получить
Name Value Percent
Ivan10020
Vlad15030
Mark25050

Change Data Capture (CDC) и Change Tracking

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

Подскажите, пожалуйста, есть ли возможнось используя скрипт (возможно есть уже готовое решение), вывести список, для каких таблиц в БД включенен механизм Change Data Capture (CDC) и/или Change Tracking?

Спасибо.

Не удаляются старые резервные копии

$
0
0
Здравствуйте. Как я понял, мы можем удалить старые файлы в задаче самого бэкапа, если мы пишем в 1 файл. Если в разные, то нам необходимо отдельное правило. Я его создал, оно выполняется по логам успешно, но файлы остаются. Что же не так ?


И могу ли я еще транзакции убивать? Добавить через запятую? bak,trn

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