2011-11-14 5 views
0

트리거가 새로 도입되었습니다. 나는 이런 식의 테이블을 가지고있다.SQL Server 단순 삽입 트리거 문제

CREATE TABLE [dbo].[Positions](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [ParentId] [int] NOT NULL, 
    [Path] [varchar](100) NULL, 
    [Title] [nvarchar](200) NOT NULL, 
    [Description] [nvarchar](1000) NULL 
) 

레코드를 삽입 할 때 트리거가 경로를 업데이트하는 트리거를 쓰려고한다.

The Path = the path of parent +/+ Id of new inserted record.

나는 이런 식의 방아쇠를 가지고있다. 그러나 항상 1Path 란에 맞춘다.

ALTER trigger [dbo].[ti_updatepath] 
on [dbo].[Positions] 
after insert 
as 
begin 

declare @NewId int = (select Id from Inserted) 
declare @NewParentId int = (select parentId from Inserted) 

declare @ParentPath varchar ; 
set @ParentPath = (select path from positions where Id = @NewParentId) 

declare @Path varchar; 
set @path = @ParentPath + '/'+ convert(varchar ,@NewId) 
update Positions set Path = @path where Id= @NewId 
end 

는 추가 정보를 원하시면, 내 표는 다음과 같이 채워 : 당신은 자신의 길이를 지정해야합니다 문자 데이터 형식을 선언 할 때

Id   ParentId Path 
1   0   1/   
2   1   1/2   
3   2   1/2/3  
5   2   1/2/5  
6   4   1/2/6  
7   2   1/2/7  
8   2   1/2/8  
9   2   1/2/9  
10   2   12/10  
13   2   1/2/13  
14   2   1/2/14  
15   2   1/2/15  
16   2   1/2/16  
17   8   1/2/8/17  
18   8   1/2/8/18  
19   8   1/2/8/19  
20   17   1/2/8/17/20 

답변

3

, 그렇지 않으면, SQL 서버들이 같은 길이 1 그리고 있다고 가정합니다 첫 번째 문자 만 표시됩니다.

declare @ParentPath varchar(100); 
set @ParentPath = (select path from positions where Id = @NewParentId) 

declare @Path varchar**(100); 
set @path = @ParentPath + '/'+ convert(varchar(100), @NewId) 
update Positions set Path = @path where Id= @NewId 

: @NewId를 변환 할 때

당신은 또한 지정된 길이의 VARCHAR로 변환 할 필요가 VARCHAR에 (적절한 100 변경) VARCHAR (100)로 @ParentPath 및 @Path를 선언해야하고 다른 사람이 단일 INSERT 문에 여러 레코드를 삽입하면이 트리거가 실패합니다. 여러 행 삽입을 지원하도록 다시 작성해야합니다.

+2

경로 변수는 260 자 이상이어야합니다. (\\? \ 접두어로 긴 경로 형식을 허용하면 길어집니다.) http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath –

+0

@FilipDeVos, I 귀하의 의견을 upvoted 그것은 특별한 제안 (Windows 플랫폼, 파일 경로)에 대한 훌륭한 제안이기 때문에. 그러나 OP는 경로와 관련이있는 항목 (카테고리, 창 경로 또는 기타 항목)을 지정하지 않았습니다. –

+0

나는 MS SQL 서버를 Windows로 가정했다. 그 형식은 또한 'NVARCHAR'이어야합니다. 물린 후 두 번 부끄러워. –