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

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

$
0
0
Подскажите есть переменная x1 у нее тип datetime, как мне изменить её тип на varchar(255) скриптом, а не руками, через столбцы-изменить.

Оптимизированная для памяти таблица, MEMORY_OPTIMIZED

$
0
0
Всем привет.

MS SQL 2017

Есть memory_optimizwd таблица.
На ней 4 индекса.
Записей порядка 140 млн.

С течением времени начинает есть память, выделенную и используемую под индексы
(колонки
memory_allocated_for_indexes_kb
memory_used_by_indexes_kb
представления sys.dm_db_xtp_table_memory_stats
)
если после старта базы размер выделенной/используемой памяти для индексов 7 000 / 5 000 МБ,
то через несколько дней эти размеры - 30 000 / 14 000 МБ


Вопрос:
как победить такую прожорливость ?

Бэкап БД на уровне mdf, ldf-файлов. Не будет ли проблем?

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

Интересует теория по следующему вопросу.

Насколько приемлемо "создавать бэкапы" базы просто копируя файлы mdf и ldf "нагорячую", используя теневое копирование?
Копирует точно, но ..
Не будет ли потом проблемы с восстановлением путем простого подкидывания их обратно?
Я имею ввиду не будет ли проблем с нарушением целостности БД или какими-либо повреждениями?

Вероятно скажете, что BACKUP DATABASE более правильный путь, который создаст .bak-файл, но интересует именно описанный мной выше.
Не спрашивайте, зачем именно такой способ. Просто скажите Приемнем ли он впринципе или нет и почему.

как пооптимальней во view вернуть колонну из SP (или в table: computed column из SP)?

$
0
0
как пооптимальней на любой из последних 3х-4х версий SQL Server (в т.ч. 2019 CTP)
во view вернуть колонну из SP (или в table: computed column из SP)?

t-sql udf функцией вызов SP естественно не работает из-за:
'Only functions and some extended stored procedures can be executed from within a function'

SP конечно-же возвращает скаляр, например:
--drop procedure dbo.xx;
create procedure dbo.xx @x int=10 as
begin select datepart(ms,getdate())+@x as x end;
go
exec dbo.xx 1

запросы к таблицам/представлениям динамически генерирует внешнее приложение/UI
над которым нет контроля (генерирующее только select запросы, т.е. нет возможности execute)
поэтому единственный проходящий на ум путь получения фактов - запуск SP на каждую строку
предварительного набора ключей измерений (благо наборы довольно малые: до 1000 строк)

пока единственное что вижу более-менее рабочее:
это писать функцию через assembly (CLR) {пс: уже написал, т.е. через CLR работает} - что будет
на порядок медленнее т.к. эта CLR по доступу к данным, надо вызывать .NET, устанавливать
соединение и т.д, т.е. чего очень не хотелось-бы (т.к. возможно пойдёт в облако
{Azure} а там с этим немного напряг, хотя уже тоже поддерживает).
а Extended Stored Procedure (ESP) уходят в небытиё.

в общем возвращает к сабжу - как в computed column получить результат из SP (scalar) ?

оператор XOR

$
0
0
Добрый день. Хочу в условии использовать оператор XOR, ругается "Incorrect syntax near 'XOR'." Меняю его на AND или OR - все работает. Может здесь что-то с версией не-то?

Группировка без агригации других полей

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

Возникла потребность сгруппировать/отфильтрова данные

declare @A table (userid int, Channel1_Date datetime, type1_id int, Channel2_Date datetime, type2_id int,	profile_id int)

insert @A values(345,	'2019-01-23 00:00',	1,	'2018-10-19 13:30',	2,	435)
insert @A values(345,	'2018-10-25 13:30',	3,	'2019-01-25 00:00',	4,	750)
insert @A values(345,	'2018-10-22 13:30',	2,	NULL,	NULL,	NULL)
insert @A values(23,	'2019-01-26 00:00',	2,	'2019-01-25 00:00',	1,	223)
insert @A values(23,	'2019-01-27 00:00',	1,	NULL,	NULL,	NULL)
insert @A values(23,	NULL,	NULL,	'2019-01-23 00:00',	3,	224)

select * from @A  

результатом должно стать группировка по userid, и выборка самых первых дат отправки по каналу 1 и каналу 2, с сохранением атрибутов соответствующих данному каналу
для Channel1_Date атрибут type1_id
для Channel2_Date атрибут type2_id и profile_id

userid	Channel1_Date	             type1_id	Channel2_Date	             type2_id	profile_id
345,	2018-10-22 13:30:00.000,	2,	2018-10-19 13:30:00.000,	2,	435
23,	2019-01-26 00:00:00.000,	2,	2019-01-23 00:00:00.000,	3,	224

Подскажите, кто сталкивался с подобной задачей, как сделать такую выборку.

Linked to MySQL, вопрос по подключению

$
0
0
Добрый день, коллеги! Посоветуйте как подключиться к MySQL из MSSql - сейчас при проверке подключения выходит ошибка (в приложенном файле).
запускал создание подключения так:
use master
go
exec sp_addlinkedserver    'mySQLserverTest', '', 'MSDASQL', null, null, 
  'DRIVER={MySQL ODBC 3.51 Driver};Server=ЧЧЧ:3306;Database=xxx;User=yyy;Password=ppp

Как написать запрос по выборке дат

$
0
0
Ребят, помогите с запросом.
есть 2 таблицы.
1я таблица имеет дату начала dateStart и ID
2я ID и 4 поля дат. datePlanStart, dateFactStart, datePlanEnd, dateFactEnd

Нужно сделать запрос, который будет выдавать id у которого dateStart не будет пересекаться с датами из второй таблицы (не входит в промежуток datePlanStart, dateFactStart, datePlanEnd, dateFactEnd). При чем dateFact (начало и конец) будет приоритетней, чем datePlan. Т.е. это дата по факту (что произошло), а не запланировано, но даты факта могут быть еще не заполненны.

Требования для повышения грэйдов

$
0
0
Здравствуйте
Помогите пожалуйста разработать шкалу знаний (формальных) для повышения грэйдов для программистов T-SQL, может кто уже составлял, есть наработки или просто поможете если подкинете идею. Есть следующие уровни:

Программист 1-й кат.
Программист 2-й кат.
Программист 3-й кат.
Программист 4-й кат.
Программист 5-й кат.

Есть условие, что нельзя перескакивать уровень и между текущим и получением следующего должно пройти не менее полугода
У меня такие мысли:

Программист 1-й кат. - программист прошел стажировку

Программист 2-й кат. - стаж работы в должности не менее года + наличие любого сертификата ANSI или T-SQL

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

Программист 4-й кат. - стаж работы в должности не менее двух лет + наличие сертификата 70-461: Querying Microsoft SQL Server 2012/2014 или сертификат sql-ex.ru (Basic knowledge)

Программист 4-й кат. - стаж работы в должности не менее двух c половиной лет + наличие сертификата 70-461: Querying Microsoft SQL Server 2012/2014 или сертификат sql-ex.ru (All requirements)

Что скажете? очень прошу помочь

access violation at address in module ntdll.dll

$
0
0
Ошибка возникает только на ХП

при выполнении запроса

update fot set ktu=f2.ktu from fot f1 inner join
(select tabn,ktu from fot f22 where f22.mes=:mes and f22.god=:god and f22.nbr=:nbr1 ) as f2');
on f1.tabn=f2.tabn
where f1.nbr=:nbr and f1.ktu=0
and f1.mes=:mes1 and f1.god=:god1

MS SQL Server 2008

Логическая 'трансакция'

$
0
0
Есть ли возможность сделать изменения по N tаблицам, закоммитить под определенным именем
допустим Trans_2019_02_03_04_01,
и иметь возможность роллбэка трансакции под определенного имени Trans_2019_02_03_04_01 - например через сутки ?

Есть потребность делать изменения, называть их и по потребности сохранять/отменять.
Возможно ДБ имеет какую-то возможность для этого ?

Удаление строк Delete

$
0
0
Добрый день. Есть такой запрос, работает!

DECLARE @year int;

SET @year=2013;
select count(*) FROM tarn_h as hh
LEFT JOIN [tarn_t] as tt
ON tt.id=hh.id
WHERE tt.id is null and year(hh.date_b) =@year

т.е. хочу удалить данные из таблицы tarn_h за определенный год, у которых нет записей в таблице tarn_t. Две таблицы связываются по полю id.

делаю так

DELETE FROM tarn_h
FROM tarn_h as hh LEFT JOIN [tarn_t] as tt ON tt.id_doc=hh.id
WHERE tt.id is null and year(hh.date_b) =@year;

выдает ошибку

Conversion failed when converting the varchar value 'ed1e1b58-bd57-11e2-a197-003048ff1647 ' to data type int.

тип поля date_b datetime

не могу понять почему select работает, а удалять не хочет.

выборка после сортировки

$
0
0
Мне нужно сначала отсортировать данные по номеру(представлен строкой переменной длинны, не число) а затем вывести кусок из упорядоченного набора. нужно для постраничного вывода большого объема данных через хранимую процедуру. Ошибка - Предложение ORDER BY не допускается в представлениях, встроенных функциях, производных таблицах, вложенных запросах и обобщенных табличных выражениях, если вместе с ним не указано предложение TOP, OFFSET или FOR XML.

SELECT * FROM (SELECT * FROM data_from_ch ORDER BY invoice_number) AS a
	WHERE ROW_NUMBER() > @skip AND ROW_NUMBER() <= @skip + @countatpage;

помощь в запросе с обновлением данных в 2 таблицах

$
0
0
Друзья, подскажите пожалуйста, как можно проще проапдейтить единым значением разные данные
у меня есть гости с id 99,98, 76, и т.д. - просто набор данных, в последовательность не заложить
и вот надо всем этим значениям из таблицы Accessor присвоить значение 20 в таблице Abstract с синхронизацией по id
как то можно это реализовать через временные таблицы, или через массив?
Я пока пишу для каждой операции данный запрос:

UPDATE Abstract SET Value = 20
WHERE Id = (SELECT Id FROM Account WHERE AccountId = (SELECT Id FROM Account WHERE AccountableId = (SELECT Id FROM Accessor WHERE Ext = '99')))

Мониторинг процесса восстановления БД

$
0
0
Всем - здравствуйте!
Мы восстанавливаем БД из backup-а, сделанного на другом сервере.
Восстановили полный backup.
До текущего состояния - накатываем транлоги.
Чтобы мониторить процесс наката логов, смотрим какой лог накатывается, идём на сервер-источник, смотрим, когда лог был создан. Всё - через GUI.
Это - не очень удобно.
Можно ли запросом видеть на какой момент времени сейчас восстанавливается лог?
Спасибо заранее.

Подскажите как добавить столбец, где при выполнения условие писалась бы 1, иначе null

$
0
0
Добрый день.
После определенного запроса получаю таблицу такого вида:

id oid plan
7D1AFC91-340C0ADA876A-4C54120
0B2463DF-CCF10ADA876A-4C54300
C4EBF923-2C97B8BBC8B6-F36F 400
04F5782D-687FE0472205-8C900


Сам запрос:
select TC.ID as id, CON.OID as oid, TC.ProductPlan as plan
from database1 AS CON
left join database2 AS TC ON TC.OID = CON.OID AND Date = '2019-05-03 00:00:00.000' AND Day = 'День'
where CON.IP = '1.2.3.4'
group by CON.OID, TC.ProductPlan, TC.ID


Для понимания таблица database1:

IP OID
1.2.3.4 0ADA876A-4C54
1.2.3.4 B8BBC8B6-F36F
1.2.3.4 E0472205-8C90


Сама проблема, нужно добавить столбец check. Если в результате запроса будут повторяющиеся поля CON.OID нужно в поле написать 1 иначе null.

Результат запроса должен получится таким:

id oid plan check
7D1AFC91-340C0ADA876A-4C541201
0B2463DF-CCF10ADA876A-4C543001
C4EBF923-2C97B8BBC8B6-F36F 400null
04F5782D-687FE0472205-8C900null


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

Процедура отслеживания изменений

$
0
0
Товарищи, приветствую

Мне необходимо написать процедуру отслеживания изменений (на основании маппинга пакетов). С чего начать - понятия не имею, опыт совсем не большой. Маппинг я сделал - хотя как по мне он достаточно странный. В визуал студио я открывал пакет. Переходил во вкладку data flow далее открывал источник и копировал код. Код вставлял в notepad++ и искал совпадения данного когда в файле. Как итог я получал путь пакетам. Результат скидывал в эксель - 1 столбец название пакета в визуал студио, 2 столбец путь ( к примеру c:\engine\packages\, 3 стобец сам запрос.

Теперь на основании всего этого необходимо сделать процедуру отслеживания изменений. Вчера читал ms docs по этой теме...Прошу вас направить меня в нужное русло, что нужно, чтобы начать. Какие изменения должна отслеживать процедура?

буду рад вашим советам

спасибо, Товарищи

Лицензирование двух версий MSSQL

$
0
0
Коллеги, на сервере 16 ядер, куплены лицензии MSSQL EE для 2014 версии, SA не продлено в свое время.

Потребовалось на этот же сервер к уже существующим инстансам 2014 версии добавить один инстанс 2016. Какие есть варианты лицензирования 2016, кроме покупки лицензий на все 16 ядер?

full-text search - Поиск по значению

$
0
0
Доброго времени суток.
Вопрос. Пытаюсь Добавить full-text search.

Имеется таблица

CREATE TABLE [dbo].[UserInfoData_FIO](
	[Id] [uniqueidentifier] NOT NULL,
	[UserInfoId] [uniqueidentifier] NOT NULL,
	[_Modify] [datetime] NOT NULL,
	[SystemUserId] [nvarchar](450) NOT NULL,
	[Rating] [smallint] NULL,
	[Value] [nvarchar](400) NOT NULL,
 CONSTRAINT [PK_UserInfoData_FIO] PRIMARY KEY CLUSTERED 
(
	[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]

GO


Добавлен каталог

CREATE FULLTEXT CATALOG [UserInfoData_FIO]WITH ACCENT_SENSITIVITY = ON

GO



В данном каталоге выбрана нужная таблица UserInfoData_FIO в качестве поля выбрано поле Value


В таблице UserInfoData_FIO в поле Value лежит значение равное 1

Далее делаю выборку

SELECT TOP 10 * FROM [dbo].[UserInfoData_Country] as country WHERE  CONTAINS (country.Value, '1')


Но результата нет. Вопрос что надо изменить что бы выполнялся корректный поиск

Заранее Благодарен

Вступление в партицирование

$
0
0
Добрый день
Пытаюсь впервые разобраться с партицированием. Задача: убедиться по плану запроса, что выбираются данные только из той партиции, в которой лежат нужные данные.

Нашел статью коллеги Гладченко тынц
где написано следующее:
если выполнить
create partition function pf(int) as range for values (0, 10, 100)
create partition scheme ps as partition pf all to ([PRIMARY])
create table t (a int, b int) on ps(a)

select * from t where a < 0

то в плане выполнения будет
|–Table Scan(OBJECT:([t]), WHERE:([t].[a]<(0)) PARTITION ID:((1)))

Однако, когда указанное выполняю я, вижу:
|--Table Scan(OBJECT:([master].[dbo].[t]), SEEK:([PtnId1001] >= (1) AND [PtnId1001] <= RangePartitionNew(CONVERT_IMPLICIT(int,[@1],0),(0),(0),(10),(100))), WHERE:([master].[dbo].[t].[a]<CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)

Что я делаю не так?
Viewing all 7251 articles
Browse latest View live