Ответы пользователя по тегу SQL Server
  • Можно ли использовать pivot в xml файле?

    unfilled
    @unfilled
    Pivot использовать можно, но работает он не так, как вы, судя по всему, ожидаете.
    Пивоту нужна агрегатная функция и явный перечень значений по которым столбец будет разворачиваться в строку
    select  * from (
      select T.col.value('@Kind','varchar(30)') as Attribute_King,
      T.col.value('.','varchar(30)') as StrVal
      from @xml_doc.nodes('//*:Attribute') as T(col)
    ) as p
    PIVOT (
       MAX(Attribute_King)  for [StrVal] in([230425416398244922], [Payment])
    ) as piv


    для примера подставил пару значений из StrVal
    Ответ написан
    Комментировать
  • Почему SSMS не подключается к серверу?

    unfilled
    @unfilled
    Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

    ЕМНИП, по-умолчанию сетевые соединения запрещены, нужно явно разрешить их через SQL Server Configuration Manager. Возможно, потребуется и перезапуск сервера
    Ответ написан
    Комментировать
  • Как не блокировать соседние записи для обновления добавив триггер?

    unfilled
    @unfilled
    Предполагаю, что проблема в том, что:
    1. колонка [ClientTableId] в дочерней таблице не индексирована, соответственно, каждое срабатывание триггера вычитывает всю таблицу
    2. у [ClientTableId] тип nvarchar, который не совпадает с типом колонки Id в родительской таблице, поэтому при каждом срабатывании триггера, требуется преобразование типа nvarchar к int, что "отключит" возможность использования индекса, даже при его наличии
    Ответ написан
    Комментировать
  • Как использовать merge into?

    unfilled
    @unfilled
    Какая у вас версия SQL Server? OPENJSON появился в 2016, ЕМНИП.
    Если отдельно подзапрос с OPENJSON выполняется, я бы вынес его в cte, а в USING указал имя cte.
    Ответ написан
    Комментировать
  • Как устранить данную ошибку в соединение в MSSQL?

    unfilled
    @unfilled
    Вы подключаетесь к LocalDB, но, судя по ошибке "Не найден компонент Local Database Runtime", у вас не установлен Local Database Runtime (исполняю кэпа). Инструкция по его установке от MS.
    Ответ написан
  • Как правильно настроить учетные записи sql сервера?

    unfilled
    @unfilled
    У меня однажды были проблемы с настройкой соединения в Maintenance Plan, когда я создавал его на локальном компьютере, а при подключении через RDP к серверу и запуске SSMS там, всё проходило нормально. Не разбирался с чем это связано.

    Чем вас не устроил Local Server Connection, который создаётся по умолчанию? Попробуйте указать полное (FQDN) имя сервера. Если всё равно не получается, попробуйте, как вариант, временно запустить SQL Server Browser и найти сервер в сети.
    Ответ написан
  • Как объединить большое количество таблиц?

    unfilled
    @unfilled
    dynamic-sql: собираете текст запроса в nvarchar(max) и выполняете его через exec / sp_executesql. Легко накосячить и легко получить SQL-Injection.

    Возможно, проще будет один раз руками собрать вьюху (прописать все UNION/UNION ALL) и работать потом с ней.
    Ответ написан
  • Как оптимизировать запрос (nested loops)?

    unfilled
    @unfilled
    Я бы начал с того, что убрал все подзапросы, джойнил таблицы напрямую. Скорее всего у этого не будет никакого результата, но читать будет проще.
    Второе, что нужно сделать - это избавиться от этого:
    join (select DocumentRef, DocumentNodeStaticGUIDRef, DocumentNodeValue from DocumentNode) dn2 on dn2.DocumentRef = (select T.[value].value ('.', 'int') from DocumentSettingXML.nodes('/DocumentSetting/PreviousDocumentRef') as T([value]))
     and dn1.DocumentNodeStaticGUIDRef = dn2.DocumentNodeStaticGUIDRef
     where 
     (select T.[value].value ('.', 'int') from DocumentSettingXML.nodes('/DocumentSetting/PreviousDocumentRef') as T([value])) is not null

    Попробуйте выкинуть это в нормальную временную таблицу (не табличную переменную) и делать джойн с ней

    Nested Loops далеко не всегда плохо, проблема с ним в этом месте в том, что sql server думает, что вернётся 70 тыщ строк (Estimated Number of Rows), а возвращается (Actual Number of Rows) на несколько порядков больше. Дайте ему временную таблицу по которой он сможет построить статистику и он, скорее всего, сам построит приемлемый план.

    Если @StartDate и @EndDate - это переменные, а не параметры SP, попробуйте выполнить запрос в том виде, в котором он есть, но явно подсунув туда даты, без переменных. Если это хранимая процедура и это её параметры, попробуйте выполнить её после sp_recompile. Этот абзац актуален только в том случае, если запрос не всегда работает медленно.

    Ну и от distinct надо избавляться, да.
    Ответ написан
    Комментировать
  • Необходимо создать функцию T-SQL для работы с таблицей, хранящей дерево?

    unfilled
    @unfilled
    внутри рекурсивного cte я бы добавил "счётчик" уровней, типа
    WITH [tree] ([sp_id], [sp_parent], [lvl])
        AS
        (
        SELECT [sp_id],
        [sp_parent],
        1 as [lvl]
        FROM [site_pages_new]
        WHERE [sp_id] = 2
        UNION ALL
        SELECT [inner].[sp_id],
        [inner].[sp_parent],
        [tree].[lvl] + 1
        FROM [site_pages] AS [inner]
        JOIN [tree]
        ON [inner].[sp_parent] = [tree].[sp_id]
        WHERE [tree[.[lvl] < @level
        )

    Ну а <= или < использовать - по месту надо смотреть, что вы и как передавать будете
    Ответ написан
    Комментировать
  • Как написать запрос?

    unfilled
    @unfilled
    SELECT *
    FROM orders o
    WHERE NOT EXISTS (
    	SELECT * 
    	FROM orders o2 
    	WHERE o2.keyvalue = o.keyvalue AND completed IS NOT NULL
    )

    Если заявок много работать может очень медленно
    Ответ написан
    Комментировать
  • Как установить для всех связей в БД каскадное удаление?

    unfilled
    @unfilled
    Не уверен, что это будет самым простым способом, но чтобы это сделать - вам нужно заскриптовать все внешние ключи в текущем состоянии, потом сделать что-то вроде такого (не работает с композитными ключами), удалить ваши данные и восстановить внешние ключи по сохранённым скриптам.
    Учтите, что при пересоздании внешних ключей, SQL Server будет сканировать таблицы/индексы (при наличии) по этим ключам, чтобы убедиться, что в них нет некорректных данных. Этого можно избежать с помощью NOCHECK, но тогда ключи не будут trusted.
    Ответ написан
  • Как через SQL 2016 в планировщике сжать и почистить log.ldf (лог транзакций) файл от базы данных?

    unfilled
    @unfilled
    Файл позволяет вернуться к любой точке времени и восстановить базу на указанное время.

    Этот файл не позволяет этого сделать. Правильно настроенное резервное копирование, включающее в себя резервные копии журнала транзакций позволяет восстановить БД на любой (с оговорками) момент времени.

    Подскажите как через планировщик настроить сжатие и очистку этого файла после успешно сделанного бэкапа?

    Полный бэкап не влияет усечение журнала транзакций. Если ваша база в полной модели восстановления (что, видимо, так), и вы делаете только полные резервные копии - ваш журнал транзакций будет только расти, сколько бы шринков (DBCC SHRINKDATABASE/SHRINKFILE) вы не делали.

    Грамотный подход для того, чтобы не страдать от разрастания журнала транзакций: почитать про модели восстановления; виды резервных копий (включая резервные копии журнала транзакций); настроить резервное копирование журнала транзакций с такой частотой, которая обеспечит оптимальные для вас: размер файла журнала транзакций и объём допустимой потери данных; разово обрезать журнал транзакций с помощью DBCC SHRINKFILE.

    Быстрый подход: перевести бд в простую модель восстановления (alter database set recovery simple), выполнить инструкцию из первого ответа и забыть про рост журнала транзакций и восстановление на момент времени.
    Ответ написан
    1 комментарий
  • Какой индекс создать для таблицы?

    unfilled
    @unfilled
    Кластерный индекс лучше объявить уникальным (раз вы пишете, что TTfid уникальное. Оптимизатору всегда лучше предоставлять максимум информации.
    Что касается индексов по конкретным столбцам - нужно видеть, какие конкретно запросы вы хотите оптимизировать. Без этого - гадание на кофейной гуще. Для запроса, где "join идет по полям: TTfid, TPid и TTowner" уникальный кластерный индекс по TTfld - то что доктор прописал.
    Ответ написан
  • SQL Pivot работает неправильно, что я делаю не так?

    unfilled
    @unfilled
    Select ProcedureId, [3_1_explain_alert_system_and_boosters_required], [1_1_patient_blacklist_checked]
    FROM 
    (
        select ProcedureId, HtmlValue, TokenValue from ProcedureStepsDetails
    ) As Temp
    PIVOT
    (
        max([HtmlValue]) 
        FOR [TokenValue] In([3_1_explain_alert_system_and_boosters_required], [1_1_patient_blacklist_checked])
    ) As pt

    а так?
    Ответ написан
    2 комментария
  • Как автоматически уменьшать лог транзакций?

    unfilled
    @unfilled
    Вы делаете очень странную вещь - бэкапите логи, потом переводите БД в симпл, ломаете цепочку восстановления и возвращаетесь обратно в полную модель восстановления.
    Вы не сможете нормально воспользоваться своими бэкапами журнала транзакций после перевода в простую модель восстановления.
    Если вы хотите всё-таки использовать полную модель восстановления и иметь возможность восстановления на любой момент времени - делайте резервные копии журнала транзакций чаще и после того, как копия снята делайте DBCC SHRINKFILE без перехода в симпл.
    Если это не помогает - смотрите log_reuse_wait_desc в sys.databases - что именно мешает обрезать файл.
    Не забывайте, что на время приращения журнала транзакций, БД переходит в режим "только для чтения" - формально, конечно, ничего никуда не переходит, просто все операции записи ждут пока ЖТ вырастет.
    Ответ написан
    Комментировать
  • После уменьшения файла лога транзакций, 1с ругается в некоторых операциях?

    unfilled
    @unfilled
    Обрежьте журнал транзакций гигабайт до 5, установите приращение в 1 ГБ и не возвращайте БД в Full - вы всё равно не пользуетесь преимуществами полной модели восстановления. Оставьте в простой.
    Deadlock'и у вас появляются из-за кривого кода 1С (ищите их документацию по причинам возникновения и избавлению от взаимоблокировок - её полно). Почему не возникали раньше? Возможно, потому что после "обрезки" ЖТ и переводе в полную модель восстановления, ЖТ снова начал расти и одна из кривых операций ждала завершения приращения, когда вторая кривая операция начала выполняться. Но это мой хрустальный шар только предполагает, вам и вашим одинэсникам виднее должно быть.
    Ответ написан
    Комментировать
  • Вопрос по MS SQL MIRRORING?

    unfilled
    @unfilled
    Ответ написан
    Комментировать
  • Кэширование таблиц

    unfilled
    @unfilled
    Раньше был DBCC PINTALBE, сейчас такого механизма нет (да и PINTABLE особо не рекомендовалось к использованию).
    ИМХО, вы зря не хотите разбираться с запросами и индексами. «Закрепление» таблицы в памяти может вам и не помочь. Например, вы таблицу «закрепили», а пользователь бабахнул запрос с 10 кросс джойнами этой таблицы — в данном случае, вне зависимости от того «закреплена» она или нет, памяти уйдёт намного больше чем предполагалось.
    Плюс, suser_name() никак на кэширование данных не влияет — почему вы считаете, что кэширование не дееспособно?
    Ответ написан
  • Как бекапить MS SQL 2008 R2 с FILESTREAM. База отдельно, файлы отдельно?

    unfilled
    @unfilled
    Бэкапить основную файловую группу отдельно. Пример есть здесь (там же, в ответе, ссылка на пост где приводится пример восстановления). Только надо будет дополнительно потренироваться в восстановлении.
    Ответ написан
    Комментировать
  • BLOB to String?

    unfilled
    @unfilled
    Тут надо понимать, что такого типа данных datBlob в SQL Server не существует, то есть это какой-то самописный пользовательский тип, описание которого можно достать только у автора этого типа (нельзя посмотреть код которым он был создан) — отсюда могут быть и проблемы при CAST/CONVERT (теоретически). Плюс, типа String в SQL Server тоже нет вместо него используется VACRHCAR/NVARCHAR.
    Если вы еще не пробовали делать CAST(Picture AS nvarchar(max)), то попробуйте — вдруг получится. А если пробовали, но не получается — ищите автора и исходники этого типа данных.
    Ответ написан
    Комментировать