Are you sure you want to do this in the loop? You can insert all description in one query:
;with cte as (
select
T.C.value('.', 'nvarchar(max)') as Description
from @TheRole.nodes('/Descriptions/Description') as T(C)
)
insert into PositionDescriptions (Description)
select c.Description
from cte as c
where not exists (select * from PositionDescriptions as p where p.Description = c.Description)
If you really want a loop, use cursor:
declare
@TheRole xml, @DescriptionId int, @Description nvarchar(max)
set @TheRole = '<Descriptions><Description>TheRole Testing 123</Description><Description>TheRole Test again</Description></Descriptions>'
declare cur1 cursor local fast_forward for
select
P.DescriptionId, N.Description
from (
select
T.C.value('.', 'nvarchar(max)') as Description
from @TheRole.nodes('/Descriptions/Description') as T(C)
) as N
left outer join PositionDescriptions as P on P.Description = N.Description
open cur1
while 1 = 1
begin
fetch cur1 into @DescriptionId, @Description
if @@fetch_status <> 0 break
if @DescriptionId is null
begin
insert into PositionDescriptions (Description)
select @Description
select @DescriptionId = scope_identity()
end
-- do what you want
end
close cur1
deallocate cur1