我有一个表格,对来自多个来源的选定文件进行编目。我想在对新文件进行编目时记录文件是否与以前编目的文件重复。我的表中有一个列(“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