У меня есть таблица, которая каталогизирует выбранные файлы из нескольких источников. Я хочу записать, является ли файл дубликатом ранее каталогизированного файла во время каталогизации нового файла. В моей таблице есть столбец («primary_duplicate») для записи каждой записи как «P» (основной) или «D» (дубликат). Я хотел бы предоставить привязку по умолчанию для этого столбца, которая будет проверять другие вхождения этого файла (например, имя, длина, метка времени) во время записи нового файла.
Я создал функцию, которая выполняет эту проверку (см. «GetPrimaryDuplicate» ниже). Но я не знаю, как связать эту функцию, для которой требуются три параметра, в столбец «primary_duplicate» таблицы в качестве привязки по умолчанию.
Я бы хотел избежать использования триггера. В настоящее время у меня есть хранимая процедура, используемая для вставки новых записей, которая выполняет эту проверку. Но я хотел бы убедиться, что флаг установлен правильно, если вставка выполняется вне этой хранимой процедуры.
Как я могу вызвать эту функцию со значениями из вставляемой строки?
USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FileCatalog](
[id] [uniqueidentifier] NOT NULL,
[catalog_timestamp] [datetime] NOT NULL,
[primary_duplicate] [nchar](1) NOT NULL,
[name] [nvarchar](255) NULL,
[length] [bigint] NULL,
[timestamp] [datetime] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[FileCatalog] ADD CONSTRAINT [DF_FileCatalog_id] DEFAULT (newid()) FOR [id]
GO
ALTER TABLE [dbo].[FileCatalog] ADD CONSTRAINT [DF_FileCatalog_catalog_timestamp] DEFAULT (getdate()) FOR [catalog_timestamp]
GO
ALTER TABLE [dbo].[FileCatalog] ADD CONSTRAINT [DF_FileCatalog_primary_duplicate] DEFAULT (N'GetPrimaryDuplicate(name, length, timestamp)') FOR [primary_duplicate]
GO
USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[GetPrimaryDuplicate]
(
@name nvarchar(255),
@length bigint,
@timestamp datetime
)
RETURNS nchar(1)
AS
BEGIN
DECLARE @c int
SELECT @c = COUNT(*)
FROM FileCatalog
WHERE name=@name and length=@length and timestamp=@timestamp and primary_duplicate = 'P'
IF @c > 0
RETURN 'D' -- Duplicate
RETURN 'P' -- Primary
END
GO