Ответы пользователя по тегу SQL Server
  • Как загрузить изображения в таблицу?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Ответ написан
    Комментировать
  • Как связать таблицы, которые находятся в разных БД?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Если у вас заранее не определены базы данных и таблицы, то на стороне сервера нужно делать динамические запросы, то есть формировать запрос, как строку.
    Если определены:
    SELECT 'TABLE1', Field1, Field2
      FROM Data1.dbo.Table1
    UNION
    SELECT 'TABLE2', Field1, Field3
      FROM Data2.dbo.Table2
    Ответ написан
    Комментировать
  • Что эффективнее работает Join Composite Key или Primary Key?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Точного ответа нет. Даже если в какой-то момент что-то будет быстрее, в зависимости от использования, будут построены кэши и статистики и следующий запрос будет работать по-другому (включите статистику клиента: он покажет изменения от запроса к запросу +/- красный/зелёный).
    Это MS SQL, вы никогда не сможет сделать лучше его оптимизатора. Помочь можно: есть "Помощник по настройке ядра СУБД". Или самый первый уровень: включите действительный план выполнения и статистику активных запросов— если у оптимизатора будет предложение, оно будет зелёным цветом в виде сценария CREATE (только подставите названия объектов).

    Да и использование datetime в качестве первичного ключа (только сейчас дошло) — не допустимо:
    тестируем

    CREATE TABLE [dbo].[Table_5](
    	[ID] [datetime] NOT NULL,
    	[Name] [varchar](50) NOT NULL,
     CONSTRAINT [PK_Table_5] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[Table_5] ADD  CONSTRAINT [DF_Table_5_ID]  DEFAULT (getdate()) FOR [ID]
    GO

    Попробуем добавить:
    INSERT INTO Table_5 (Name)
      SELECT TOP(5) 'TEST' + CAST(ROW_NUMBER() OVER(ORDER BY id) AS VARCHAR)
             FROM sysobjects

    Не получается:
    Нарушено "PK_Table_5" ограничения PRIMARY KEY. 
    Не удается вставить повторяющийся ключ в объект"dbo.Table_5". 
    Повторяющееся значение ключа: (ноя 12 2021  3:06PM).


    Более подробно: системный таймер Windows, по-умолчанию, срабатывает 1000/64 раз в секунду, а точность datetime 1000/300, что должно было бы обеспечить уникальность последовательных значений. Но MS SQL, с помощью timeBeginPeriod, увеличивает частоту срабатывания таймера до 1000/1000. То есть при записи в datetime и округления до его точности, значения потеряют уникальность. Это известная коллизия этого типа данных не позволяет использовать его, как первичный ключ. В 1С есть специальная обработка для построения хронологических цепочек (например, что бы различать оплату и аванс относительно отгрузки), которая устанавливает на документах несовпадающее время.
    1) 1 PK - Int, 2) 1 PK - Datetime, 3) Year, Month - int Composite Key, 4) Year, Month, Day - int Composite Key
    datetime - это int+int. В первом — дата, во втором — время, которое, исходя из 3 и 4 пункта использовано не будет (и эти пункты излишни, естественно). Если вы хотите использовать дату как первичный ключ — используйте тип данных date (3 байта).
    Ответ написан
    3 комментария
  • Как заполнить таблицу случайными данными?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Из комментария в вопросе:
    INSERT INTO sales (Product_idProduct, sale_date, price, [count])
      SELECT TOP(100) (RAND(id) * 3) + 1, 
                       DATEADD(dd, - (1000 * RAND(id)), GETDATE()), 
                       (RAND(id) * 100) + 1, (RAND(id) * 10) + 1
        FROM sysobjects
        ORDER BY id DESC
    Ответ написан
    Комментировать
  • Как запустить скрипт?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Проверьте правильно ли указан сервер localhost\Exos9300. Попробуйте просто Exos9300.
    Для тестирования используйте UDL. То есть создайте пустой файл с этим расширением и запустите его.
    Проверка
    618270dceb07b773702272.png

    В этом файле и будет название сервера Data Source=TSK-Home.

    И ещё попробуйте прямой запрос:
    osql -S TSK-Home -E -Q "BACKUP DATABASE [ComputerWare] TO DISK = '%BackUp%\ms-sql\ComputerWare.bak' WITH INIT, NOUNLOAD, NAME = 'ComputerWare archive', NOSKIP, NOFORMAT, STATS = 25"
    Ответ написан
    4 комментария
  • Как посчитать количество записей в группе по критерию и если их нет то вывести ноль?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    COUNT и возвращает 0, если нет строк отвечающих условию.

    Если нужны все факультеты, то:
    SELECT FacultyName, ISNULL(CN.Co,0)
      FROM Faculty
        LEFT JOIN (SELECT [Card].FacultyId,  COUNT(*) AS Co
    FROM [Card] 
    JOIN Diagnosis  ON [Card].CardId = Diagnosis.CardId
    JOIN Diagnosies  ON Diagnosies.Id = Diagnosis.Diagnosis
    WHERE Diagnosies.DiagnosisName = N'грип' AND YEAR(Diagnosis.VisitDate) = 2000
    GROUP BY [Card].FacultyId) AS CN
          ON CN.FacultyId = Faculty.FacultyID
    Ответ написан
  • Как перевести wsus с wid на sql-сервер?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Никак. Вы быстро упрётесь в ограничения редакции Express.
    Посмотрите на размер ваших файлов в C:\Windows\WID.
    Например, вы будет это проделывать достаточно регулярно?

    Основные особенности Windows Internal Database:
    База данных WID предполагает только локально использование, удаленно к ней подключиться не получится.
    Отсутствуют ограничения на размер файлов БД (в отличии от той же редакции SQL Express).
    Не требует для своего использования лицензии.
    Ответ написан
    Комментировать
  • Создание представления для выдачи товарооборота по месяцам?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    В соседнем вопросе я уже давал ссылку на календарный отчёт (простой). Используйте его как шаблон. И не забывайте, что PIVOT, это в некотором роде группировка. Сделайте запрос по sales и месяцам. SUM([price] * [count]) будет в ячейках, код продукта по вертикали. Потом добавите во внутренний запрос INNER JOIN к таблице products и вместо кода товара можете использовать его наименование.
    Про товарооборот продумайте порядок: поставщик - товар или наоборот и нужно ли суммировать поступление и продажу или в месяце сделать две колонки. И ещё: год - сделать страницы по годам или ещё как?

    Например, так:

    SELECT [Year], [Product], [Январь], [Февраль], [Март], 
                              [Апрель], [Май], [Июнь], 
                              [Июль], [Август], [Сентябрь], 
                              [Октябрь], [Ноябрь], [Декабрь]
        FROM 
          ( SELECT YEAR(sale_date) AS [Year],
                   products.title AS [Product], 
                   DATENAME(MONTH, sale_date) AS [MonthName],
                   price * count AS SaleSum
              FROM sales 
                INNER JOIN products ON sales.Product_idProduct = products.idProduct) AS enMonth
        PIVOT ( SUM(SaleSum)  
         FOR [MonthName] IN ( [Январь], [Февраль], [Март], 
                              [Апрель], [Май], [Июнь], 
                              [Июль], [Август], [Сентябрь], 
                              [Октябрь], [Ноябрь], [Декабрь])
              ) AS enPivot
      ORDER BY 1 DESC, 2

    Русские названия месяцев:
    SET LANGUAGE Russian;  
    SELECT DATENAME(MONTH, 1), DATENAME(MONTH, 32), DATENAME(MONTH, 60)

    Январь Февраль Март
    Ответ написан
    Комментировать
  • Как сделать разностное резервное копирование?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    BACKUP DATABASE … TO … WITH INIT  
    BACKUP DATABASE … TO … WITH DIFFERENTIAL

    Руководство.

    -- включение xp_cmdshell, запустить ОДИН раз
    EXECUTE sp_configure 'show advanced options', 1;  
    GO  
    RECONFIGURE;  
    GO  
    EXECUTE sp_configure 'xp_cmdshell', 1;  
    GO  
    RECONFIGURE;  
    GO


    -- создание месячного резерва
    DECLARE @BF VARCHAR(256), @BN VARCHAR (128) 
    DECLARE @DT VARCHAR(8) = CONVERT( VARCHAR, GETDATE(), 112)
    SET @BF = 'MKDIR C:\Temp\' + SUBSTRING(@DT, 1, 4)
                               + '\' + SUBSTRING(@DT, 5, 2)
    -- создание папки 2021\11
    EXECUTE xp_cmdshell @BF 
    SET @BF = 'C:\Temp\' + SUBSTRING(@DT, 1, 4)
                         + '\' + SUBSTRING(@DT, 5, 2)
                         + '\Testus.bak'
    SET @BN = 'Testus' + CONVERT( VARCHAR, GETDATE(), 121)
    BACKUP DATABASE Testus TO DISK = @BF WITH COPY_ONLY, NAME = @BN
    -- сжатие
    -- BACKUP DATABASE Testus TO DISK = @BF WITH COMPRESSION, COPY_ONLY, NAME = @BN

    Проверить совместимость: сжатие резервных копий.

    Ночью делаете полную резервную копию:
    -- создание ежедневного полного резерва
    DECLARE @BF VARCHAR(256), @BN VARCHAR (128)
    SET @BF = 'forfiles /P C:\Temp /M Testus-* /C "cmd /c DEL @path" /D -5'
    -- удаление резервов старше 5 дней
    EXECUTE xp_cmdshell @BF 
    SET @BF = 'C:\Temp\Testus-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
    SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
    BACKUP DATABASE Testus TO DISK = @BF WITH INIT, NAME = @BN

    Потом в рабочее время — разностную, например, каждый час:
    -- создание разностного резерва
    DECLARE @BF VARCHAR(256), @BN VARCHAR(128)
    SET @BF = 'C:\Temp\Testus-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
    SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
    BACKUP DATABASE Testus TO DISK = @BF WITH DIFFERENTIAL, NAME = @BN


    Задание можно выполнять планировщиком ОС или SQL-сервера (руководство).
    Обработку файлов (перемещение, удаление и пр.), также средствами ОС или SQL-сервера (xp_cmdshell).

    бывают еще ручные резервные копии
    Чтобы не нарушить порядок автоматический резервов, нужно делать резерв с параметром COPY_ONLY в специальный файл.
    -- создание ручного полного резерва
    DECLARE @BF VARCHAR(256), @BN VARCHAR (128)
    SET @BF = 'C:\Temp\Testus-cp-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
    SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
    BACKUP DATABASE Testus TO DISK = @BF WITH COPY_ONLY, NAME = @BN


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

    Восстановление:
    Выбирайте день (имя файла) и восстанавливаете до нужного состояния.
    День и последнее
    61826e5178641930962219.png

    можно выбрать не последнюю
    61826e75e1590439730463.png
    Ответ написан
  • Как удалить данные за период и проверить на целостность?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Про удаление написал ScriptKiddo.
    Целостность данных нужно не проверять, а регулировать (ограничивать) внешними ключами. Перед очисткой проверьте, что бы у них были правильно указаны
    ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

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

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    SELECT ( SELECT SUM(ammount) FROM journal WHERE idoperation = 1 )
         - ( SELECT SUM(ammount) FROM journal WHERE idoperation = 2 ) AS result
    Ответ написан
    Комментировать
  • Как исправить запрос?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Документация.
    Использовать
    -- Aggregate Function Syntax    
    SUM ( [ ALL | DISTINCT ] expression )

    или
    -- Analytic Function Syntax   
    SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
    Ответ написан
    Комментировать
  • Как найти дату предыдущего заказа и пред предыдущего заказа?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    SELECT TOP(3) [DateOrder] FROM [Order] WHERE ([Client] = @ID) AND ([DateOrder] <= @DT)
      ORDER BY [DateOrder] DESC
    Ответ написан
    Комментировать
  • Как найти сумму средних значений?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    бюджет остается тот же
    Зачем вычислять среднее для одинаковых значений? Среднее и будет этим значением. Значит нужно брать по одной строке для каждого iid.
    SELECT SUM(one_bug)
      FROM( SELECT DISTINCT iid, bugs AS one_bug FROM projects ) AS DB


    Ваш вопрос — последствия нарушения нормальной формы. Подзапрос — это и есть таблица "Проект". Для контрактов нужна отдельная таблица.
    Ответ написан
    Комментировать
  • Как удалить конкретную запись или группу в одном запросе?

    tsklab
    @tsklab Автор вопроса, куратор тега SQL Server
    Здесь отвечаю на вопросы.
    CREATE PROCEDURE VariationDelete @KEY VARCHAR(10), @ID INT = -1
    AS
      DELETE FROM [Variation]
        WHERE ([Key] = @KEY) AND ((@ID = -1 ) OR (ID = @ID ))
    --
    GO

    Когда не указан @ID удаляются все записи по @KEY, когда указан — только одна запись.
    Ответ написан
    Комментировать
  • SQL Server Managment?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Кроме проверки работы службы. Проверьте клиентские протоколы: они должны быть не только включены, но и активны, с нужным номером порта. По-умолчанию для MS SQL Server Express протокол TCP/IP выключен.
    А вот именованный канал \\.\pipe\sql\query — включён.
    Ответ написан
    Комментировать
  • Как выбрать необходимый DateTime?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    SELECT Accounts.id
      FROM Accounts
        INNER JOIN Boo ON Accounts.id = Boo.id
      WHERE Accounts.[datetime] BETWEEN DATEADD(hh, -10, Boo.[datetime]) AND Boo.[datetime]
    Ответ написан
    Комментировать
  • Восстановление стандартных баз данных?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Документация по миграции.

    Как перенести базы данных с одного сервера на другой?
    Пользовательские — проще всего отсоединить, скопировать mdf-файл и присоединить его на новом сервере, помня об отсутствии у MS SQL обратной совместимости. Документация.
    Ответ написан
    Комментировать
  • Как создать пользовательский тип данных?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Ответ написан
    Комментировать
  • Как сделать User Mapping на отдельный сервер?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Подключиться к удалённому серверу через SSMS и добавить туда этот логин.

    Некоторые другие варианты…
    Ответ написан