1

여러 원본에서 선택한 파일을 카탈로그하는 테이블이 있습니다. 새 파일이 카탈로그 될 때 파일이 이전에 카탈로그 화 된 파일의 사본인지 여부를 기록하고 싶습니다. 테이블 ("primary_duplicate")에 각 항목을 'P'(기본) 또는 'D'(복제)로 기록하는 열이 있습니다. 새 파일을 기록 할 때이 파일의 다른 항목 (예 : 이름, 길이, 시간 소인) 을 확인하는이 열의 기본 바인딩을 제공하고 싶습니다.Sql Server 열의 기본 바인딩에 대한 매개 변수화 된 함수를 사용하는 방법

이 검사를 수행하는 함수를 만들었습니다 (아래 "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 [email protected] and [email protected] and [email protected] and primary_duplicate = 'P' 

    IF @c > 0 
     RETURN 'D' -- Duplicate 

    RETURN 'P' -- Primary 

END 

GO 
+0

를 - 코드의 일부가 포함되지 않은 이유를 확실하지 서식을 지정하는 방법과이를 수정하는 방법은 다릅니다. –

답변

1

대신 트리거를 사용해야합니다. 트리거는 삽입 된 행의 복사본을받습니다.

2

존, 그 질문에 대한 답변이 아니며, 그가 방아쇠를 사용해야한다고 생각하는 것은 무의미합니다. 그가 무엇을하려고하는지 또는 그가 기본값으로하고 싶어하는 이유가 무엇인지 모릅니다.

'가능하지 않으므로 대신 트리거를 사용해야합니다.'라고 말했을 수도 있으므로 실제로 뭔가를 배울 수 있습니다. 나는 당신이 트리거가 무엇인지, 그리고 그들이 무엇을 위해 사용될 수 있는지를 잘 알고있을 것입니다.

OP : 죄송합니다. 동일한 정보를 찾고 있습니다.

2

질문 : 처음 질문을 제기 한 후 2.5 년이 지나야 게시됩니다. 기본 바인딩이있는 일반 열 대신 primary_duplicate 열에 대해 계산 된 열을 사용하는 것이 좋습니다.

MSDN에 따르면 DEFAULT 정의의 constant_expression은 테이블의 다른 열이나 다른 테이블, 뷰 또는 저장 프로 시저를 참조 할 수 없습니다.

계산 된 열은 다른 한편으로는 가능합니다.

이 같은 함수 정의 :

CREATE FUNCTION [dbo].[GetPrimaryDuplicate] 
(
    @id uniqueidentifier, 
    @catalog_timestamp datetime, 
    @name nvarchar(255), 
    @length bigint, 
    @timestamp datetime  
) 
RETURNS nchar(1) 
AS 
BEGIN 

IF EXISTS (
    SELECT 1 
    FROM FileCatalog 
    WHERE [email protected] and [email protected] and [email protected] 
     and catalog_timestamp < @catalog_timestamp 
) 
    RETURN 'D' -- Duplicate 

    RETURN 'P' -- Primary 

END 

그런 다음 다음 ALTER TABLE 문을 실행 : 나는 가난한 코드 형식에 대해 사과

GO 
ALTER TABLE [dbo].[FileCatalog] DROP COLUMN primary_duplicate 
ALTER TABLE [dbo].[FileCatalog] ADD primary_duplicate as dbo.GetPrimaryDuplicate(id, catalog_timestamp, name, length, timestamp)