Подскажите есть переменная x1 у нее тип datetime, как мне изменить её тип на varchar(255) скриптом, а не руками, через столбцы-изменить.
↧
как скриптом изменить тип переменной
↧
Оптимизированная для памяти таблица, MEMORY_OPTIMIZED
Всем привет.
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 МБ
Вопрос:
как победить такую прожорливость ?
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-файлов. Не будет ли проблем?
Добрый день!
Интересует теория по следующему вопросу.
Насколько приемлемо "создавать бэкапы" базы просто копируя файлы mdf и ldf "нагорячую", используя теневое копирование?
Копирует точно, но ..
Не будет ли потом проблемы с восстановлением путем простого подкидывания их обратно?
Я имею ввиду не будет ли проблем с нарушением целостности БД или какими-либо повреждениями?
Вероятно скажете, что BACKUP DATABASE более правильный путь, который создаст .bak-файл, но интересует именно описанный мной выше.
Не спрашивайте, зачем именно такой способ. Просто скажите Приемнем ли он впринципе или нет и почему.
Интересует теория по следующему вопросу.
Насколько приемлемо "создавать бэкапы" базы просто копируя файлы mdf и ldf "нагорячую", используя теневое копирование?
Копирует точно, но ..
Не будет ли потом проблемы с восстановлением путем простого подкидывания их обратно?
Я имею ввиду не будет ли проблем с нарушением целостности БД или какими-либо повреждениями?
Вероятно скажете, что BACKUP DATABASE более правильный путь, который создаст .bak-файл, но интересует именно описанный мной выше.
Не спрашивайте, зачем именно такой способ. Просто скажите Приемнем ли он впринципе или нет и почему.
↧
как пооптимальней во view вернуть колонну из SP (или в table: computed column из SP)?
как пооптимальней на любой из последних 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 конечно-же возвращает скаляр, например:
запросы к таблицам/представлениям динамически генерирует внешнее приложение/UI
над которым нет контроля (генерирующее только select запросы, т.е. нет возможности execute)
поэтому единственный проходящий на ум путь получения фактов - запуск SP на каждую строку
предварительного набора ключей измерений (благо наборы довольно малые: до 1000 строк)
пока единственное что вижу более-менее рабочее:
это писать функцию через assembly (CLR) {пс: уже написал, т.е. через CLR работает} - что будет
на порядок медленнее т.к. эта CLR по доступу к данным, надо вызывать .NET, устанавливать
соединение и т.д, т.е. чего очень не хотелось-бы (т.к. возможно пойдёт в облако
{Azure} а там с этим немного напряг, хотя уже тоже поддерживает).
а Extended Stored Procedure (ESP) уходят в небытиё.
в общем возвращает к сабжу - как в computed column получить результат из SP (scalar) ?
во 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
Добрый день. Хочу в условии использовать оператор XOR, ругается "Incorrect syntax near 'XOR'." Меняю его на AND или OR - все работает. Может здесь что-то с версией не-то?
↧
↧
Группировка без агригации других полей
Добрый день!
Возникла потребность сгруппировать/отфильтрова данные
результатом должно стать группировка по userid, и выборка самых первых дат отправки по каналу 1 и каналу 2, с сохранением атрибутов соответствующих данному каналу
для Channel1_Date атрибут type1_id
для Channel2_Date атрибут type2_id и profile_id
Подскажите, кто сталкивался с подобной задачей, как сделать такую выборку.
Возникла потребность сгруппировать/отфильтрова данные
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, вопрос по подключению
Добрый день, коллеги! Посоветуйте как подключиться к 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
↧
Как написать запрос по выборке дат
Ребят, помогите с запросом.
есть 2 таблицы.
1я таблица имеет дату начала dateStart и ID
2я ID и 4 поля дат. datePlanStart, dateFactStart, datePlanEnd, dateFactEnd
Нужно сделать запрос, который будет выдавать id у которого dateStart не будет пересекаться с датами из второй таблицы (не входит в промежуток datePlanStart, dateFactStart, datePlanEnd, dateFactEnd). При чем dateFact (начало и конец) будет приоритетней, чем datePlan. Т.е. это дата по факту (что произошло), а не запланировано, но даты факта могут быть еще не заполненны.
есть 2 таблицы.
1я таблица имеет дату начала dateStart и ID
2я ID и 4 поля дат. datePlanStart, dateFactStart, datePlanEnd, dateFactEnd
Нужно сделать запрос, который будет выдавать id у которого dateStart не будет пересекаться с датами из второй таблицы (не входит в промежуток datePlanStart, dateFactStart, datePlanEnd, dateFactEnd). При чем dateFact (начало и конец) будет приоритетней, чем datePlan. Т.е. это дата по факту (что произошло), а не запланировано, но даты факта могут быть еще не заполненны.
↧
Требования для повышения грэйдов
Здравствуйте
Помогите пожалуйста разработать шкалу знаний (формальных) для повышения грэйдов для программистов 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)
Что скажете? очень прошу помочь
Помогите пожалуйста разработать шкалу знаний (формальных) для повышения грэйдов для программистов 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
Ошибка возникает только на ХП
при выполнении запроса
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
при выполнении запроса
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
↧
Логическая 'трансакция'
Есть ли возможность сделать изменения по N tаблицам, закоммитить под определенным именем
допустим Trans_2019_02_03_04_01,
и иметь возможность роллбэка трансакции под определенного имени Trans_2019_02_03_04_01 - например через сутки ?
Есть потребность делать изменения, называть их и по потребности сохранять/отменять.
Возможно ДБ имеет какую-то возможность для этого ?
допустим Trans_2019_02_03_04_01,
и иметь возможность роллбэка трансакции под определенного имени Trans_2019_02_03_04_01 - например через сутки ?
Есть потребность делать изменения, называть их и по потребности сохранять/отменять.
Возможно ДБ имеет какую-то возможность для этого ?
↧
Удаление строк Delete
Добрый день. Есть такой запрос, работает!
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 работает, а удалять не хочет.
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 работает, а удалять не хочет.
↧
выборка после сортировки
Мне нужно сначала отсортировать данные по номеру(представлен строкой переменной длинны, не число) а затем вывести кусок из упорядоченного набора. нужно для постраничного вывода большого объема данных через хранимую процедуру. Ошибка - Предложение 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 таблицах
Друзья, подскажите пожалуйста, как можно проще проапдейтить единым значением разные данные
у меня есть гости с id 99,98, 76, и т.д. - просто набор данных, в последовательность не заложить
и вот надо всем этим значениям из таблицы Accessor присвоить значение 20 в таблице Abstract с синхронизацией по id
как то можно это реализовать через временные таблицы, или через массив?
Я пока пишу для каждой операции данный запрос:
у меня есть гости с 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')))
↧
Мониторинг процесса восстановления БД
Всем - здравствуйте!
Мы восстанавливаем БД из backup-а, сделанного на другом сервере.
Восстановили полный backup.
До текущего состояния - накатываем транлоги.
Чтобы мониторить процесс наката логов, смотрим какой лог накатывается, идём на сервер-источник, смотрим, когда лог был создан. Всё - через GUI.
Это - не очень удобно.
Можно ли запросом видеть на какой момент времени сейчас восстанавливается лог?
Спасибо заранее.
Мы восстанавливаем БД из backup-а, сделанного на другом сервере.
Восстановили полный backup.
До текущего состояния - накатываем транлоги.
Чтобы мониторить процесс наката логов, смотрим какой лог накатывается, идём на сервер-источник, смотрим, когда лог был создан. Всё - через GUI.
Это - не очень удобно.
Можно ли запросом видеть на какой момент времени сейчас восстанавливается лог?
Спасибо заранее.
↧
Подскажите как добавить столбец, где при выполнения условие писалась бы 1, иначе null
Добрый день.
После определенного запроса получаю таблицу такого вида:
Сам запрос:
Для понимания таблица database1:
Сама проблема, нужно добавить столбец check. Если в результате запроса будут повторяющиеся поля CON.OID нужно в поле написать 1 иначе null.
Результат запроса должен получится таким:
Помогите пожалуйста.
После определенного запроса получаю таблицу такого вида:
|
Сам запрос:
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:
|
Сама проблема, нужно добавить столбец check. Если в результате запроса будут повторяющиеся поля CON.OID нужно в поле написать 1 иначе null.
Результат запроса должен получится таким:
|
Помогите пожалуйста.
↧
Процедура отслеживания изменений
Товарищи, приветствую
Мне необходимо написать процедуру отслеживания изменений (на основании маппинга пакетов). С чего начать - понятия не имею, опыт совсем не большой. Маппинг я сделал - хотя как по мне он достаточно странный. В визуал студио я открывал пакет. Переходил во вкладку data flow далее открывал источник и копировал код. Код вставлял в notepad++ и искал совпадения данного когда в файле. Как итог я получал путь пакетам. Результат скидывал в эксель - 1 столбец название пакета в визуал студио, 2 столбец путь ( к примеру c:\engine\packages\, 3 стобец сам запрос.
Теперь на основании всего этого необходимо сделать процедуру отслеживания изменений. Вчера читал ms docs по этой теме...Прошу вас направить меня в нужное русло, что нужно, чтобы начать. Какие изменения должна отслеживать процедура?
буду рад вашим советам
спасибо, Товарищи
Мне необходимо написать процедуру отслеживания изменений (на основании маппинга пакетов). С чего начать - понятия не имею, опыт совсем не большой. Маппинг я сделал - хотя как по мне он достаточно странный. В визуал студио я открывал пакет. Переходил во вкладку data flow далее открывал источник и копировал код. Код вставлял в notepad++ и искал совпадения данного когда в файле. Как итог я получал путь пакетам. Результат скидывал в эксель - 1 столбец название пакета в визуал студио, 2 столбец путь ( к примеру c:\engine\packages\, 3 стобец сам запрос.
Теперь на основании всего этого необходимо сделать процедуру отслеживания изменений. Вчера читал ms docs по этой теме...Прошу вас направить меня в нужное русло, что нужно, чтобы начать. Какие изменения должна отслеживать процедура?
буду рад вашим советам
спасибо, Товарищи
↧
↧
Лицензирование двух версий MSSQL
Коллеги, на сервере 16 ядер, куплены лицензии MSSQL EE для 2014 версии, SA не продлено в свое время.
Потребовалось на этот же сервер к уже существующим инстансам 2014 версии добавить один инстанс 2016. Какие есть варианты лицензирования 2016, кроме покупки лицензий на все 16 ядер?
Потребовалось на этот же сервер к уже существующим инстансам 2014 версии добавить один инстанс 2016. Какие есть варианты лицензирования 2016, кроме покупки лицензий на все 16 ядер?
↧
full-text search - Поиск по значению
Доброго времени суток.
Вопрос. Пытаюсь Добавить full-text search.
Имеется таблица
Добавлен каталог
В данном каталоге выбрана нужная таблица UserInfoData_FIO в качестве поля выбрано поле Value
В таблице UserInfoData_FIO в поле Value лежит значение равное 1
Далее делаю выборку
Но результата нет. Вопрос что надо изменить что бы выполнялся корректный поиск
Заранее Благодарен
Вопрос. Пытаюсь Добавить 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')
Но результата нет. Вопрос что надо изменить что бы выполнялся корректный поиск
Заранее Благодарен
↧
Вступление в партицирование
Добрый день
Пытаюсь впервые разобраться с партицированием. Задача: убедиться по плану запроса, что выбираются данные только из той партиции, в которой лежат нужные данные.
Нашел статью коллеги Гладченко тынц
где написано следующее:
если выполнить
то в плане выполнения будет
|–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)
Что я делаю не так?
Пытаюсь впервые разобраться с партицированием. Задача: убедиться по плану запроса, что выбираются данные только из той партиции, в которой лежат нужные данные.
Нашел статью коллеги Гладченко тынц
где написано следующее:
если выполнить
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)
Что я делаю не так?
↧