2015-01-13 4 views
0

ID 열이있는 테이블이 있습니다. 여러 이유 때문에 해당 열에서 ID를 제거해야했습니다. 이전 방법으로 해당 테이블에 값을 삽입하고 식별 열에 대해 null을 전달하는 시스템이 있습니다. 에는 전달되는 경우 값을 수신 할 수있는 ID 열을 정의하는 간단한 방법이 있으며 값이 전달 된 경우 해당 테이블에없는 해당 필드에 고유 값을 설정하도록 해당 테이블을 만들려면 (신분처럼 행동하십시오).이전 ID 필드에 값 삽입

내 말은 가치가 있다면 삽입하는 것입니다. 그리고 시스템이 ID와 같은 null act를 삽입하려고 시도하는 경우.

미리 감사드립니다.

+1

을보십시오 : 당신이 할 수있는 한 가지는 최대 플러스 ROW_NUMBER 결합하기 위해 SELECT를 변경할 수 있습니다 아니. 당신은 "당신 자신의"롤을 가지고있을 것이고 이것은 동시성으로 인해 항상 문제가됩니다. –

답변

1

트리거는이 상황에서 좋은 선택 인 것처럼 보이지만 상황을 처리 할 수있는 방법이 많이 있습니다.

아래 예에서는 삽입 할 것으로 예상되는 열을 가져 오는 INSTEAD OF 삽입 트리거를 만들고 ID 열이 null 인 경우 함수를 통해 새 값을 생성합니다.

CREATE TRIGGER myTrigger ON myTable 
INSTEAD OF INSERT 
AS 
    INSERT INTO myTable (myIDcolumn, anotherColumn) 
    SELECT COALESCE(myIDColumn, dbo.SomeMethodToCreateID), anotherColumn 
    FROM inserted 

작동 방법은 SomeTheodToCreateID입니다.

SELECT (COALESCE(myIDColumn, 
    (SELECT MAX(myIDColumn) FROM myTable) + ROW_NUMBER() OVER(ORDER BY anotherColumn) 
) 
... 
+0

이 나쁜 상황만큼이나 좋은 얻을 수 있습니다. 이것은 잠재적 인 동시성 문제를 가지고 있으며 이것은 문제보다는 증상을 다루고 있지만 수행 할 수있는 모든 것에 대한 상황을 감안할 때입니다. –

0

는 한마디로이

DBCC CHECKIDENT ('. [DBO] [고객]', RESEED, 1)