Ответы пользователя по тегу SQL
  • Как лучше хранить фото-данные?

    @Sumor
    Я приведу преимущества хранения в БД перед хранением ссылок:
    1. Данные и фото хранятся в одном месте - в БД. При перемещении БД на другой сервер перемещается вся база с фотографиями. В случае хранения ссылок вы данные и фотографии перемещаете отдельно и после перемещения вам нужно будет обновить ссылки в новой БД.
    2. Положенная в БД фотография доступна всегда. В случае ссылок на другие ресурсы они могут оказаться недоступными. Их могут удалить, переместить, переименовать, так как не очевидно, что на эти фотографии есть ссылки из какой-либо БД.
    3. Транзакционность. При добавлении/изменении фото, если у вас случится проблема посередине процесса, то запись не будет добавлена/обновлена. В случае хранения ссылок может оказаться, что файл будет добавлен, а запись в БД не сохранится или наоборот запись в БД обновится, а сохранение файла не пройдёт.
    4. Из 2 и 3 вытекает необходимость, в случае хранения ссылок, периодически проверять соответствие между ссылками и файлами.
    Ответ написан
    2 комментария
  • Как переделать Sql запрос в EntityFramework?

    @Sumor
    Примерно так (написал по памяти без студии):
    var paramLink = …;
    var paramFilter = …;
    var result Nav.Where(nav => nav.Link == paramLink && nav.Filter == paramFilter)
        .GroupBy(nav => new {Link = nav.Link,Vendor = nav.Vendor} , nav => nav)
        .OrderBy(grNav => grNav.Key.Vendor).Select(grNav => new {Link = grNav.Key.Link, Vendor = grNav.Key.Vendor, Count = grNav.Count()});

    Вместо анонимного класса new {Link = nav.Link,Vendor = nav.Vendor} возможно лучше использовать что-то типа KeyValuePair или другой класс, который для установления равенства объектов сравнивает их реквизиты.
    Ответ написан
    Комментировать
  • Как в триггерах ссылаться на таблицы и поля этих таблиц?

    @Sumor
    Для SQLServer это таблицы inserted и deleted Использование таблиц inserted и deleted.
    Подумайте об использовании транзакций вместо триггеров. Особенно если предполагается отмена действия в триггере по какому-либо условию.
    Триггер отделён от логики добавления данных о платеже и изучающему ваш код будет неочевидно почему изменилась таблица Долг.
    Триггеры можно случайно/специально/для отладки отключить и вы получите кучу проблем.
    Ответ написан
    Комментировать
  • Запросы к SQL Server в Visual Studio как вывести результат в WPF?

    @Sumor
    Простые запросы можно просто выполнять через SqlConnection/SqlCommand.
    SqlConnectionStringBuilder - задаёте сервер БД, БД, вид аутентификации.
    SqlConnection - присоединяетесь.
    Создаёте SqlCommand. Задаёте либо текст команды, либо хранимку, вместе с параметрами.
    Выполняете SqlCommand - либо ExecuteNonQuery - если не требуется ответа. ExecuteScalar - если один ответ. ExecuteReader - для чтения результатов.
    В цикле читаете - раскладываете куда надо.
    Ответ написан
    2 комментария
  • Консолидация данных из баз филиалов в центральной базе c агрегированием. Как реализовать/что выбрать?

    @Sumor
    Здесь очень многое зависит от условий задачи.
    1. Есть или нет связь между серверами MS SQL, хотя бы раз в какое-то время.
    2. БД небольшие и агрегируются целиком, или огромная и планируется не только пополнять, но и удалять записи.
    3. Насколько часто вы хотите этим заниматься.
    4. И много много чего ещё.

    Нужно: одинаковая структура объединяемых данных, просчёт всех возможных коллизий, которые могут возникнуть при слиянии. Использовать GUID в качестве идентификаторов (можно пользоваться функцией NEWSEQUENTIALID для новых записей). Помечать какая запись откуда пришла, возможно потребуется хранить удалённые записи.

    Если у вас сервера связаны, или хотя бы иногда связываются - то лучше всего работать с репликациями. Если нет - выгружать БД в бэкапы, отдельные файлы передачи данных и тп, тащить на сервер агрегации и там уже сливать в кучу.
    Ответ написан
  • Как в sql сделать поиск по фамилии с опечатками?

    @Sumor
    К сожалению не сильно знаком с DB2, но думаю подходы примерно одинаковые.
    Во-первых, поиск можно сделать регистронезависимым на уровне БД или таблицы. В MSSQL он по-умолчанию регистронезависимый. Гуглить по словам COLLATION COLLATE. Например посмотреть тут.

    Ну а дальше можно использовать алгоритмы нечёткого поиска.
    Достаточно подробно в соответствующей статье на Хабре.
    Если у вас БД небольшая (до тысяч фамилий), то можно её банально пробежать и сравнить с искомой по расстоянию Дамерау-Левенштейна. Оформить можно функцией. Работать будет примерно так:
    SELECT * FROM People WHERE Distance(People.Family, 'Иванов') < 2

    Если сравнение по расстоянию занимает много времени, то можно применить алгоритм триграмм.
    Повесить триггер на вставку/изменение: генерировать по фамилии триграммы и складывать в отдельную таблицу.
    Тогда для поиска необходимо искомую фамилию также разложить на триграммы и искать их в таблице триграмм.
    Примерная фамилия должна соответствовать почти всем искомым триграммам.

    Можно использовать механизмы свёрток, по типу SOUNDEX, но они дают большой шум и работают хорошо только при записи фамилий на слух.
    Ответ написан
    1 комментарий
  • Почему не работает SQL запрос?

    @Sumor
    По мне, так лучше всё объединить, а потом подсчитать. Примерно так (возможны синтаксические ошибки):
    SELECT COUNT(*) AS count
    FROM orders o 
    JOIN order_comments oc ON o.id = oc.order_id
    JOIN order_comment_views ocv ON ocv.comment_id = oc.id
    WHERE o.id =286 AND ocv.user_id =1
    Ответ написан
  • Как задать другого пользователя при подключении через Microsoft SQL Server 2014?

    @Sumor
    Можно запустить Management Studio или sqlcmd через runas с указанием нужных вам логинов и паролей.
    Ответ написан
    Комментировать
  • Очень медленная работа MS SQL с VS 2013, в чем причина?

    @Sumor
    Долгое соединение с MSSQL может быть из-за проверки сертификатов клиентского компьютера.
    В Internet Explorer, на сервере с MSSQL нужно отключить проверку отозванных сертификатов.

    Internet Explorer -> "Internet Options" -> Advanced".
    Отключить:
    Проверять аннулирование сертификатов издателей (Check for publisher's certificate revocation)
    Проверять аннулирование сертификатов серверов (Check for server certificate revocation)
    Ответ написан
    Комментировать
  • Как посмотреть данные в БД на удаленном компьютере (MS SQL)?

    @Sumor
    Используя любой дистрибутив MSSQLServer, любой версии и редакции, можно установить только клиентское приложение SQL Server Management Studio.
    В том числе можно использовать бесплатные дистрибутивы MS SQL Server Express.

    MSSQL express 2012

    Про подключение к другому серверу:
    MSDN
    Ответ написан
    Комментировать
  • Как в MS SQL изменить определенные строки?

    @Sumor
    Нет возможности проверить, но примерно можно написать следующий запрос:
    UPDATE Table
    SET
    	fio = SUBSTRING(fio, 1, LEN(fio) - 2) + '.' + SUBSTRING(fio, LEN(fio), 1) + '.'
    WHERE SUBSTRING(fio, LEN(fio) - 3, 1) = ' ' and SUBSTRING(fio, LEN(fio) - 1, 1) = ' '

    Смысл в том, что вы отбираете строки у которых последние 4 символа: пробел + буква + пробел + буква. И вы для таких строк формируете строку с точками.
    Ответ написан
    1 комментарий
  • Как заблокировать таблицу в SQL?

    @Sumor
    Прочитай про разные уровни изоляции. Например:
    MSDN SQL server
    MSDN ADO
    Wikipedia
    Ответ написан
    Комментировать
  • Как остановить выполнение SqlCommand?

    @Sumor
    Cancel пытается отменить запрос и пытается передать это на SQLServer. Если запрос длительный и состоит из отдельных шагов, и эти шаги ещё на начали исполняться, то команда прервётся. Если идёт выдача, то она тоже может прерваться.
    Вам же, если вы прервались, не обязательно продолжать считывать - прерывайтесь, больше не вызывайте Read(), закрывайте reader и извещайте пользователя. При использовании BeginExecuteReader вы сможете проще организовать процесс ожидания и прерывания, но чуть сложнее процесс получения данных.

    В одном проекте я поступал несколько по-другому. Я быстро получал идентификаторы объектов, релевантных запросу, а затем спокойно в отдельном потоке начитывал строчки с данными (много медленных колонок). Процесс этот контролировался мной и мог прерваться в любой момент. В качестве бонуса получается правильный прогрессбар.
    Ответ написан
    Комментировать
  • Где найти примеры и материалы для самостоятельного освоения BeginExecuteReader?

    @Sumor
    А чем вам не нравится пример из MSDN?
    msdn.microsoft.com/ru-ru/library/1a674khd(v=vs.110...
    Вы можете проверять состояние IAsyncResult не в цикле, как в примере, а в таймере, попутно отображая прогресс выполнения.
    Ответ написан
    Комментировать
  • Как отсортировать диалоги пользователя и создать правильный список?

    @Sumor
    Для сортировки в sql-запросе используется конструкция order by.
    Заодно прочитайте про sql-инъекции.
    Ответ написан
  • Почему не соединяется SQL Local DB?

    @Sumor
    Нужна установка .Net 4.0.2 или выше, например, 4.5.
    Помимо этого нужна установка MSSQL Server Express.
    Строка подключения правильная.
    Ответ написан
  • Почему выводится ошибка при добавлении записи в MS SQL?

    @Sumor
    executeQuery вызывается для SELECT запросов, которые возвращают результирующие наборы.
    В вашем случае нужно использовать executeUpdate, который предназначен для команд UPDATE INSERT DELETE, которые результирующие наборы не возвращают.
    Ответ написан
    Комментировать
  • Транзакция в MS SQL - как осуществить проверку?

    @Sumor
    Нужно использовать в дополнение к транзакциям механизм блокировок.
    Например, для MSSQL www.sql.ru/articles/mssql/2004/04110303advancedloc...

    В твоём случае это будет примерно так:
    BEGIN TRAN BUYITEM;
    
    Select cash from users (UPDLOCK) WHERE id = @id;
    
    UPDATE users SET cash = cash-@cash WHERE id = @id;
    INSERT INTO items VALUES (@id, @item);
    
    COMMIT TRAN BUYITEM;

    Пока одна транзакция что-то пишет, считает и обновляет — другие будут ждать её завершения.
    Ответ написан
    2 комментария