2011-11-14 3 views
0

Je suis nouveau pour les déclencheurs. Je table comme cesql server insert simple déclencheur problème

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 
) 

Ce que je suis en train d'écrire un déclencheur dans lequel, lorsque jamais un disque inséré, le déclencheur à jour le chemin.

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

J'ai un déclencheur comme celui-ci, Mais il a toujours mis la colonne 1 dans Path qui n'est pas correcte.

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 

pour plus d'infos, ma table peuplée comme ceci:

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 

Répondre

3

Lors de la déclaration des types de données de caractères Vous devez spécifier leur longueur, sinon, SQL Server suppose qu'ils sont de longueur 1 et en tant que telle il montrera le premier caractère seulement.

Vous devez déclarer @ParentPath et @Path comme varchar (100) (100 à changer approprié) et lors de la conversion @NewId en varchar Vous devez convertir en varchar de longueur spécifiée aussi:

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 

Notez que ce déclencheur échouera si quelqu'un insère plusieurs enregistrements dans une seule instruction INSERT. Vous devez le réécrire pour prendre en charge plusieurs insertions de lignes.

+2

Les variables de chemin doivent comporter 260 caractères. (plus long si vous autorisez le chemin long avec le préfixe \\? \) voir http://msdn.microsoft.com/fr-fr/library/aa365247%28VS.85%29.aspx#maxpath –

+0

@FilipDeVos, I upvoted votre commentaire parce que c'est une suggestion brillante pour un cas particulier (plate-forme Windows, chemins de fichiers). Cependant, OP n'a pas spécifié à quoi se rapporte le chemin (catégories, chemin de Windows ou autre chose). –

+0

J'ai supposé MS SQL Server ainsi Windows. Le type devrait également être 'NVARCHAR' d'ailleurs. Une fois mordu, deux fois timide. –