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

Вывести записи с датами разных месяцев.

$
0
0
Есть таблица в ней 2-е даты: "Дата принятия" и "Дата оприходования"
Нужно вывести те даты в которых месяцы различаются на "1", то есть переходящие месяца.
То есть:

Прих Оприх
2016-05-27 2016-05-29
2016-05-28 2016-06-01
2016-05-26 2016-05-30
2016-05-30 2016-05-02

Результат запроса:
Прих Оприх
2016-05-28 2016-06-01
2016-05-30 2016-05-02

Как видим месяцы разные: "05" и "06"

Подскажите как реализовать.

Распределенная БД и дубликаты

$
0
0
Доброго времени суток.
Ищу совет по предотвращении дублировании данных в распределенных секцированных представлениях.
На данный момент у меня есть функция проверки(применяется в пределах хранимой процедуры) которая ищет наличие записи по соотв. параметрам но это слишком не надежный вариант, так как при достаточной нагрузке несколько потоков могут паралельно инициировать выполнение хранимой процедуры на вставку.
Можно ли поместить саму функцию поиска дубликатов в транзакцию на вставку с хином TABLOCKX(и/или HOLDLOCK) тем самым блокируя таблицы до окончания транзакции. Насколько тогда высока вероятность дедлока? Есть ли другие более адекватные возможности борьбы с возможным дублированием?

Заранее благодарю за конструктивные предложения.

Проблема с созданием плана обслуживания в MSSMS

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

Windows Server 2008 R2
MS SQL Server 2016

В MSSMS добавляют план обслуживания.
Получаю ошибку: Невозможно создать задачу из XML для задачи "", тип "", из-за ошибки 0x80070057 "Параметр задан неверно.".

Заметил, что в MSSMS, в меню "Сервис/Выбрать элементы панели элементов" нет ни одного элемента.
Проверил, файлы на месте (Microsoft.SqlServer.MaintenancePlanTasks.dll и Microsoft.SqlServer.MaintenancePlanTasks.xml".

В чем может быть проблема?

Заранее спасибо!

Подробности ошибки:

===================================

Невозможно создать задачу из XML для задачи "", тип "", из-за ошибки 0x80070057 "Параметр задан неверно.".
(OnPreExecute)

------------------------------
Расположение программы:

в Microsoft.SqlServer.Dts.Runtime.Executables.Add(String moniker)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintenancePlanSubPlan.AddPreExecuteTask(Sequence subplanSeq)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintenancePlanSubPlan..ctor(Package package, DtsContainer container, ServerConnection localConnObj)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintenancePlan.SubPlansCollection.Add(DtsContainer container)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintenancePlanData.AddSubPlan(String name)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintenancePlanData..ctor(Package source, ServerConnection localServerConnection, Boolean isNewPlan)
в Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintView.LoadMaintenancePlan(String connectionString, IManagedConnection connection, String objectUrn)
в Microsoft.DataTransformationServices.VsIntegration.DtsDesignerService.OpenDesigner(String connectionString, Object connection, String objectUrn)
в Microsoft.SqlServer.Management.DatabaseMaintenance.MaintDesignerMenuHandler.Invoke()

===================================

Невозможно создать задачу из XML для задачи "", тип "", из-за ошибки 0x80070057 "Параметр задан неверно.".
(OnPreExecute)

------------------------------
Расположение программы:

в Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSExecutables100.Add(String bstrMoniker)
в Microsoft.SqlServer.Dts.Runtime.Executables.Add(String moniker)

Сделать точную копию базы на этом же сервере.

$
0
0
Есть MS SQL Server 2008.
Запускаем Server Management Studio и видим несколько баз, к примеру
baza
baza2
baza3
Необходимо прямо тут же сделать копию baza3 и назвать её baza4.

Ни в интернете, ни в справке не могу найти ответ.
Такое ощущение, что ответ так прост, что никто не заморачивался с его описанием.
Находятся ответы как сделать резервную копию (это я и так умею), как восстановить на другом сервере (и это умею) и тому подобное.
А мне надо на этом же сервере сделать точно такую же базу со всеми таблицами, пользователями, правами, но с другим названием.
Пробовал сделать бэкап, а потом ресторе с другим именем - пишет RESTORE HEADERONLY c ошибкой 262, поэтому решил, чтобы нечаянно не убить боевую базу - сдаться и написать сюда.

Вообще задача не моя, на меня её по ошибки свалили, и я даже подозреваю кто у нас на работе знает как делать копии, ведь кто-то делал когда-то эти копии baza2, baza3, но видимо у того человека тётя Ирма приехала или я ему не нравлюсь - он дал мне все логины-пароли и сказал, что больше ничего не знает и не помнит, а стучать начальству я не привык, решил сам разобраться и встрял.
Помогите выстрять.

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

имитация нагрузки на сервер (паралельный запуск Job)

$
0
0
Доброго времени суток

есть Job (задание), в котором набор команд имитирующих нагрузку пользователя
задание запускается 1 раз в минуту

Вопрос - есть ли способ запускать это задание в паральльное исполнение нужное количество раз не создавая каждое из них по отдельности ?

Проблемы с кодировкой открываемых файлов SSMS 2016 + Win10

$
0
0
Привет всем. Подскажите, если кто сталкивался. Файлы скриптов сохранены в win1251. .

Поставил новую винду десятку и новую SSMS 2016, соответственно.

Русский текст в файлах превратился в крякозябры.

INSERT or DELETE что дешевле весит, и когда

$
0
0
Я пытаюсь подобрать оптимальный способ обновления таблицы.
Пример:
Есть две таблицы trg и src:
CREATE TABLE src (pmid INT PRIMARY KEY, str1 VARCHAR(MAX), str2 VARCHAR(MAX), ...., str101 VARCHAR(MAX));
CREATE TABLE trg (pmid INT PRIMARY KEY, str1 VARCHAR(MAX), str2 VARCHAR(MAX), ...., str101 VARCHAR(MAX));
Обе таблицы одинаковы и содержат одни и теже данные, но src является источником данных для trg.
В какой то момент времени, из таблицы src были удалены строки, ровно 50%. Чтобы синхронизировать trg из src, как вариант, можно выполнить один из двух способов:
1 вар.:	TRUNCATE TABLE trg; INSERT INTO trg SELECT src.* FROM src;
2 вар.: DELETE trg WHERE NOT EXISTS(SELECT id FROM src WHERE src.pmid = trg.pmid);
я думаю, что первый вариант будет выгодным, если в таблице src будет удалено 90% строк, а второй, когда в таблице будет удалено только 10%. Но вопрос в том, при каком количестве удаленных строк (примерно), оба варианта одинаково весят? И что на этот ответ влияет?

запрос в БД

$
0
0
имеется бд Университет. в ней есть таблицы студенты, преподаватели и экзамен. таблица экзамен содержит информацию о сдаче экзамена( id студента,id преподавателя, оценка, дата). таблица студенты и преподаватели никак не связаны. вся связь происходит через бд Экзамен. то есть студенты связаны с экзаменом 1 ко многим и преподаватели с экзаменом 1 ко многим. задача: для каждого студента вывести всех преподавателей, у которых он еще не сдавал экзамен. вопрос: как это сделать?

Как запретить удаление записей в базе ?

$
0
0
привет
Работаю в базе через managment studio
боюсь случайно вместо select сделать delete
подскажите простой способ чтобы в базу можно было только добавлять элементы
но не удалять. readonly не прокатит - база рабочая и в нее идут записи и апдейты
собственно вопрос касается запрета на managment studio
ниразу такого не было но хочу подстраховаться - а то чуть не нажал delete from и вот пост.

Проблемы с получением данных с прилинкованного сервера

$
0
0
Доброго времени суток!

Сервер MS SQL 2012 с линком на базу Oracle.

Селекты через openquery выполняются без проблем.

Но базе Oracle есть одна большая табличка при обращении к которой возникает ошибка:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "LINKSERVER" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "LINKSERVER".

Подскажите - в чем может быть проблема и как ее побороть?

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

Все время завершается служба sql server (sqlexpress)

$
0
0
SQL SERVER 2005.
В чем причина? В каких-то логах может пишет что-то?

Поменять поле партицирования

$
0
0
Есть таблица A с полями
  • ObjID - UUID
  • Property - float
  • Date1 - datetime
  • Date2 - datetime

    Таблица типа куча, кластерного индекса нет. СУБД MS SQL 2014,

    Сейчас таблица партицирована по полю Date1 некоторой функцией партицирования. Требуется изменить поле партицирования на Date2 с той же функцией партицирования.

    Чтение интернетов навело на следующий алгоритм:
    1. Создается кластерный неуникальный индекс по полю партицирования, выровненный по партициям.
    2. Кластерный индекс пересоздается - перестраивается по [Primary]
    3. Кластерный индекс удаляется.
    4. Кластерный индекс создается, с нужным полем и по партициям
    5. Кл индекс удаляется.

    Но - на шаге 2 выводится сообщение:
    Msg 7739, Level 16, State 1, Line 17
    The partition scheme of table 'А' cannot be changed because there exists one or more incremental statistics on the table.
    


    На таблице есть автоматически созданные статистики. На базе было включено Auto Create Incremental statistics = on, Auto Create Statistics = on.
    Вопрос - как поменять поле партицирования. Вижу два подхода:
    1. Удалить эти инкрементные статистики.
    2. Забить на походод с кластерными индексами и пойти по пути "создание таблицы А_new, перелив данных в нее, удаление А, переименование"

    Что думаете?
  • Параметр READ_COMMITTED_SNAPSHOT переключается в OFF

    $
    0
    0
    Доброго времени суток!
    Есть проблема с установкой параметра для базы READ_COMMITTED_SNAPSHOT на SQL Server 2008 R2. На форуме встречал, что указанный параметр устанавливается навсегда. Но я столкнулся с проблемой, что он переключается. Причем от перезагрузки службы/агента/сервера это не зависит. Также включил этот параметр в системной базе Model, но не помогло. Но на Model параметр не слетает. Какая может быть причина изменения READ_COMMITTED_SNAPSHOT с ON на OFF?

    Запрос по выбору макс. дат

    $
    0
    0
    Добрый день, всем!

    Просьба подсказать в запросе:

    Есть таблица книг (Journal_car)
    id_j_car – ИД книги

    и таблица выдачи книг (Car_out), в которой:
    id_j_car – ИД книги
    dt_out – дата выдачи книги
    dt_return – дата возврата книги
    id_car_out – ИД записи в таблице выдачи

    (см. таблица_Car_out.JPG)

    Надо выбрать все книги и показать максимальную дату выдачи если книга выдавалась (если нет – то пусто) и дату возврата, если книга возвращалась:
    SELECT a.id_j_car,MAX(l.dt_out) as dt_out,l.dt_return FROM Journal_car a, Car_out l WHERE a.id_j_car=l.id_j_car GROUP BY a.id_j_car,l.dt_return ORDER BY a.id_j_car DESC
    

    Висит задача ReorganizeIndexes

    $
    0
    0
    SQL2008r2 DB =0.5Tb
    Настроена ежедн. реорганиз.индексов.
    Обычно выполнялся за 4 часа.
    А сегодня висит уже 15 часов. База 24/7.
    В Job Activity Monitor висит как Executing.

    Можно ли безопасно сбросить/стопорнуть задачу (из того же монитора) ?

    MsSqlServer 2012

    $
    0
    0
    Я совсем зеленый в плане знания T-Sql и прошу совета\помощи
    Есть таблица в которой есть пары строк в которых, одно и то же значение ID
    Например
    ID|code
    ------
    1 | 13
    1 | 11
    2 | 31
    2 | 87

    etc..
    Вопрос вот в чем, как можно получить результат типо
    ID|Codes
    ----------
    1 |13, 11
    2 |31, 87
    etc
    Подскажите пожалуйста, чем нужно воспользоваться?

    Очереди брокера после перезапуска

    $
    0
    0
    После перезапуска ОС очереди брокера не работают, хотя все статусы ок
    Переподключение очередей решает проблему. sql 2012
    Что я делаю не так?

    Что может быть? Куда копать?

    $
    0
    0
    Ситуация следующая. На SQL Server version:
    Microsoft SQL Server 2016 (RTM-GDR) (KB3194716) - 13.0.1722.0 (X64) 
    Sep 26 2016 13:17:23
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor)
    который используется для тестов реализован откат после очередного теста через restore from snapshot. Работает нормально, но!
    На одной БД периодически вываливается ошибка:
    Corruption in database ID 10, object ID 41 possibly due to schema or catalog inconsistency. Run DBCC CHECKCATALOG.
    В этой БД объект 41 - select object_schema_name(41),object_name(41): sys syscolpars - системная таблица.

    чекдб этой БД после этой ошибки выдает эту же ошибку. Лечится - восстановлением из бэкапа этой БД. Причем после восстановления чекдб проходит без ошибок.
    Так же... на этом сервере работа идет с несколькими БД одновременно, но валится именно на БД - №10!!!

    На мой взгляд это скорее всего ошибки в драйверах. Сисадмин утверждает, что вряд-ли, аргументируя, что именно одна БД валится с этой ошибкой. Мне этот аргумент действительно дает понять что что то не то именно с указанной БД. На других серверах которые были ранее тестовыми - проблемы этой не было....

    Что это вообще может быть?

    Выборка , работа с датами MS SQL Server

    $
    0
    0
    Например есть даты

    Date
    2014-10-04
    2016-04-08
    2016-07-01
    2016-07-01

    применяется функция select min(date) from table в данном выражении нам даст ответ - 2014-10-04 , как прописать scpript следующей даты начиная от минимальной даты 2016-04-08 типо min(date) + 1 , нужен синтаксис.

    SQL Server 2008 R2

    Спасибо

    For Xml Path и default namespace

    $
    0
    0
    Имея запрос:
    +
    ;WITH XMLNAMESPACES (DEFAULT 'http://www.w3schools.com')
    SELECT
      1 AS col1,
      rez.bbb
    FROM
      (SELECT NULL AS col) AS tbl
      CROSS APPLY (SELECT
                     2 AS col2
                   FOR XML PATH(''), TYPE
                  ) AS rez(bbb)
    FOR XML PATH('xml'), TYPE
    

    получаем
    <xml xmlns="http://www.w3schools.com">
      <col1>1</col1>
      <bbb>
        <col2 xmlns="http://www.w3schools.com">2</col2>
      </bbb>
    </xml>
    

    Если изменим так:
    +

    ;WITH XMLNAMESPACES (DEFAULT 'http://www.w3schools.com')
    SELECT
      1 AS col1,
      rez.bbb.query('.')
    FROM
      (SELECT NULL AS col) AS tbl
      CROSS APPLY (SELECT
                     2 AS col2
                   FOR XML PATH('bbb'), TYPE
                  ) AS rez(bbb)
    FOR XML PATH('xml'), TYPE
    

    получим
    <xml xmlns="http://www.w3schools.com">
      <col1>1</col1>
      <bbb xmlns="http://www.w3schools.com">
        <col2>2</col2>
      </bbb>
    </xml>
    


    А надо получить:
    <xml xmlns="http://www.w3schools.com">
      <col1>1</col1>
      <bbb>
        <col2>2</col2>
      </bbb>
    </xml>
    

    Есть один ущербный вариант:
    +
    SELECT
      CAST(
      N'<xml xmlns="http://www.w3schools.com">' +
      CAST(rez.r.query('/xml/*') AS NVARCHAR(MAX)) +
      N'</xml>' AS XML)
    FROM
    (
      SELECT
        1 AS col1,
        rez.bbb
      FROM
        (SELECT NULL AS col) AS tbl
        CROSS APPLY (SELECT
                       2 AS col2
                     FOR XML PATH(''), TYPE
                    ) AS rez(bbb)
      FOR XML PATH('xml'), TYPE
    ) AS rez(r)
    

    Вопрос. Есть ли способ решения проблемы не используя режим EXPLICIT и без CAST ?
    P.S. Xml очень большой и многоуровневый, xmlns проставляется почти везде.
    Viewing all 7251 articles
    Browse latest View live