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).
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 байта). 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
localhost\Exos9300
. Попробуйте просто Exos9300
. UDL
. То есть создайте пустой файл с этим расширением и запустите его. 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"
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
C:\Windows\WID
.Основные особенности Windows Internal Database:
База данных WID предполагает только локально использование, удаленно к ней подключиться не получится.
Отсутствуют ограничения на размер файлов БД (в отличии от той же редакции SQL Express).
Не требует для своего использования лицензии.
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)
Январь Февраль Март
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
бывают еще ручные резервные копииЧтобы не нарушить порядок автоматический резервов, нужно делать резерв с параметром
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
всего, меньше от полнойТут всё уже зависит от приложения. На стороне сервера можно лишь сжать базу данных (руководство) и дефрагментировать индексы (руководство). Это повысит плотность и, возможно, уменьшит количество изменённых страниц.
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
бюджет остается тот жеЗачем вычислять среднее для одинаковых значений? Среднее и будет этим значением. Значит нужно брать по одной строке для каждого
iid
.SELECT SUM(one_bug)
FROM( SELECT DISTINCT iid, bugs AS one_bug FROM projects ) AS DB
Как перенести базы данных с одного сервера на другой?Пользовательские — проще всего отсоединить, скопировать mdf-файл и присоединить его на новом сервере, помня об отсутствии у MS SQL обратной совместимости. Документация.