SQL Server простой вопрос вставки триггера - PullRequest
0 голосов
/ 14 ноября 2011

Я новичок в триггерах. У меня есть таблица, как это

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.

У меня есть такой триггер, но он постоянно устанавливает столбец 1 в Path, что неверно.

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 

1 Ответ

3 голосов
/ 14 ноября 2011

При объявлении символьных типов данных Вы должны указать их длину, в противном случае SQL Server будет считать, что они имеют длину 1, и поэтому будет отображать только первый символ.

Вам необходимо объявить @ParentPath и @Path как varchar (100) (измените значение 100 на соответствующее), а при преобразовании @NewId в varchar также необходимо преобразовать его в varchar указанной длины:

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

Обратите внимание, что этот триггер завершится ошибкой, если кто-то вставит несколько записей в одну инструкцию INSERT. Вы должны переписать его для поддержки вставки нескольких строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...