О том о сём

PostgreSQL и MSSQLServer: Ограничение количества отображаемых строк выборки

Вывести первые 100 строк запроса:

select * from table_name
order by id
limit 100
PostgreSQL limit
select * from table_name 
fetch next 100 rows only
PostgreSQL fetch
select * from table_name
order by id
offset 0 rows fetch next 100 rows only
Microsoft SQL Server offset...fetch

Вывести 100 строк выборки, пропустив 20 строк:

select * from table_name
order by id
limit 100 offset 20
PostgreSQL limit...offset
select * from table_name 
offset 20 rows fetch next 100 rows only
PostgreSQL offset...fetch
select * from table_name
order by id
offset 20 rows fetch next 100 rows only
Microsoft SQL Server offset...fetch

Стоит отметить, что для использования предложения OFFSET и FETCH в MSSQLServer требуется ORDER BY. В PostgreSQL — нет. В MS SQL Server использование offset без fetch запрещено. В PostgreSQL — нет.

Для ограничения количества выводимых строк без сдвига для Microsoft SQL Server можно воспользоваться оператором top:

select top 100 *
from table_name
order by id
Microsoft SQL Server top

Документация: PostgreSQL, MSSQLServer (offset…fetch, top).

Microsoft SQL Server, PostgreSQL, Qt, Базы данных

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQLНе во всех СУБД есть возможность настроить Резервное копирование базы данных по расписанию штатными средствами. Например, в Microsoft SQL Server это делается без проблем, а вот в PostgreSQL такой возможности «из коробки» нет.

Но выход есть: создать файл сценария и добавить его исполнение в расписание задач в Windows.

В переменных database, host, port, userName, bin, backupDir будут храниться значения имени базы данных, сервера, порта, имени пользователя БД, путь к bin папке PostgreSQL и директории сохранения резервных копий соответственно.

Пусть значение driver = 0 будет отвечать за PostgreSQL, а 1 — за Microsoft SQL Server.

Определим текст *.bat-файла:

QString batText = "@ECHO OFF \n"
        "SET dmpfile="+database+"-FullBackup-%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% \n"
        "IF \"%TIME:~0,1%\"==\" \" (SET dmpfile=%dmpfile%-0%TIME:~1,1%) ELSE (SET dmpfile=%dmpfile%-%TIME:~0,2%) \n"
        "SET dmpfile=%dmpfile%-%TIME:~3,2%-%TIME:~6,2%.backup \n"
        "set text = Begin to backup... \n"
        "echo %text% \n";
if (driver==0)
       batText += QString(
           "cd %1\ \n"
           "pg_dump.exe --host %2 --port %3 --username %4 --no-password --format" 
		   "custom --blobs --verbose --file \"%5\\%dmpfile%\" %6")
            .arg(bin, host, port, userName, 
				 backupDir.replace("/", "\\"), database);
 else
       batText += QString("SQLCMD -S %1 -E -Q \"BACKUP DATABASE %2 "
           "TO DISK = '%3/%dmpfile%' "
           "WITH INIT, NOFORMAT, SKIP, NOUNLOAD\"")
                .arg(host, database, backupDir);

Имя файла резервной копии будет иметь при этом подобный вид: DatabaseName-FullBackup-2018-08-07 -11-23-38.backup, то есть имя базы данных, FullBackup + таймстемп.

Далее запишем текст в файл: Продолжить чтение «Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL»

Microsoft SQL Server, PostgreSQL, Базы данных

Триггер на групповую вставку в таблицу в Microsoft SQL Server

Многие СУБД (например, MySQL, PostgreSQL и т.д.) умеют правильно обрабатывать события по групповой вставке данных в таблицы. Но не все. Например, триггер на групповую вставку в таблицу в Microsoft SQl Server будет отличаться. Рассмотрим примеры запросов:

insert into people
select name, surname, age from portfolio;

Или такой:

insert into people(name, surname, age) values
('John', 'Smith', 12),
('Ann', 'Black', 29),
('Samantha', 'Doeson', 38);

Продолжить чтение «Триггер на групповую вставку в таблицу в Microsoft SQL Server»

Microsoft SQL Server, Qt

QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server

Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:

QSqlQuery query;
if (!query.exec("delete from people where age < 20")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.numRowsAffected();
numRowsAffected()
QSqlQuery query;
if (!query.exec("select * from people where age < 35")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.size();
size()

Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:

qDebug() << database.driver()->hasFeature(QSqlDriver::QuerySize);

где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.

Что делать в этом случае?

Продолжить чтение «QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server»

Microsoft SQL Server, Qt, Базы данных

Подключение к базе данных MS SQL Server в Qt

В записи Подключение к базе данных в Qt на примере СУБД PostgreSQL я показала, как произвести подключение к базе данных. С MS SQL Server немного запутанней получается (не привыкать).

MS SQL Server может использовать 2 вида аутентификации: аутентификация windows и аутентификация  SQL Server. Ниже рассмотрим оба способа подключения. Продолжить чтение «Подключение к базе данных MS SQL Server в Qt»

"Нет" выгоранию, Фотография

«Нет» выгоранию: прогулки на свежем воздухе

Иногда для того, чтобы прийти в себя, нужно не много: расслабиться, забыть о суете и просто жить моментом.

Прогулка по лесу дает невероятно большой заряд энергии природы, свежий воздух дает сил, а пение птиц хорошо расслабляет.

Вот небольшой кусочек нашей такой недавней прогулки.

 

Возможно, вам понравится: Time management, или Как все успеть женщине, работающей из дома

Microsoft SQL Server

Microsoft SQL Server: Удалить MS_Description для всех колонок таблиц

Потребовалось мигрировать с PostgreSQL в Microsoft SQL Server. И я, доверчивая душа, воспользовалась программой ESF Migration tool kit. Полную версию покупать не стала — мне же на один раз только надо. А эта чудо-программа добавила в описании ко всем полям всех таблиц описание «TRIAL». Не смертельно, но и неприятно. К тому же все триггеры и функции все равно пришлось самостоятельно писать. Так вот. Программисты — люди ленивые, поэтому написала процедуру, которая сама уберет все описания к полям. Использует она системную процедуру sp_dropextendedproperty:

declare @table nvarchar(100), @column nvarchar(100);
declare cur cursor local scroll
for select A.table_name, A.column_name
from information_schema.columns A
inner join information_schema.tables B 
on(A.table_name = B.table_name)
where A.table_schema = 'dbo' and 
A.table_catalog = 'database_name' and 
--только для таблиц, не трогая представления
B.table_type='base table';

open cur;
fetch first from cur into @table, @column;
while(@@fetch_status = 0) begin
	EXEC sp_dropextendedproperty 'MS_Description', 
		N'schema', N'dbo', N'table', @table, 
		N'column', @column;
    fetch next from cur into @table, @column;
    end;
close cur;
deallocate cur;
END
Курсор для удаления описания к полям таблиц

Пример, приведенный на странице форума MSDN, почему-то не сработал — все описания остались на прежних местах.

Microsoft SQL Server, PostgreSQL

Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server

Хочу сегодня привести примеры создания функций для СУБД Microsoft SQL Server и PostgreSQL. Функция возвращает таблицу с 3-мя полями.

Как это пишется в MS SQL Server:

CREATE FUNCTION dbo.myFunction (<variables list>)
RETURNS @result_table TABLE(field1 integer, field2 integer, field3 integer) 
AS
BEGIN
    insert into @result_table 
	select val1, val2, val3 from another_table;
	return;
END
Функция в Microsoft SQL Server

А вот так в PostgreSQL:

CREATE OR REPLACE FUNCTION public.get_count_in_batch(<variabls list>)
    RETURNS TABLE(field1 integer, field2 integer, field3 integer) 
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    ROWS 1000
AS $BODY$
begin
	return query select val1, val2, val3 from another_table;
end;
$BODY$;
Функция в PostgreSQL

Конечно, здесь примеры сокращены до минимума, только лишь с целью показать механизм возврата результата. Продолжить чтение «Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server»

Будни, О том о сём

Time management, или Как все успеть женщине, работающей из дома

Сейчас в различных соц. сетях и где ни попадя предлагают посещать различные курсы, будь то курсы по увеличению продуктивности, или по улучшению понимания детского поведения, или по управлению своим временем (time management). Вокруг появилось очень много специалистов в стольких областях, о которых раньше люди и не задумывались, и все спешат заработать деньги на всякой ерунде. Мне кажется, что, имея голову на плечах и умея читать и анализировать материал, большинством навыков можно овладеть самостоятельно. Я не говорю о каких-то сугубо профильных знаниях.

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

Пока в режиме совмещения полноценной работы из дома и ведения домашних дел и заботы о родных я живу около полугода (что не очень-то много), но хотелось бы поделиться некоторыми tricks, да и будет с чем сравнить потом. Продолжить чтение «Time management, или Как все успеть женщине, работающей из дома»

C++, Qt, Портфолио

Эмулятор работы инспектора машинного зрения (формирование выходных файлов)

При написании одного проекта мне необходимо обрабатывать файлы, формируемые на основании полученных данных от инспектора машинного зрения. Содержимое файла — список штрих-кодов определенного количества, наименование файла — <год месяц день>_<штрих-код короба>. Эти файлы сохраняются в определенном каталоге,  а формируются с периодичность N миллисекунд. Для тестирования приложения мне необходимо написать эмулятор такого «инспектора». Приложение будет формировать файлы со списком штрих-кодов и сохранять в заданный каталог.

главное окно эмулятора

Основной класс, отвечающий за работу эмулятора выглядит таким образом: Продолжить чтение «Эмулятор работы инспектора машинного зрения (формирование выходных файлов)»