日期:2014-05-18  浏览次数:20341 次

SCOPE_IDENTITY()的疑惑
SQL code
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[d_dir_lists_copy_gx]

--传入参数(当前要移动的节点ID,将要放入到的那个父ID,用户ID)
(@node_id int,@new_parent_node_id int,@user_id int,@copy_node_name nvarchar(200))
as
--新产生的node_id
declare @new_node_id int
begin
        declare @new_parent_node_url nvarchar(200);
        declare @new_copy_node_name nvarchar(200);
        declare @index int;
        select @new_parent_node_url = node_url from [dbo].[d_dir_lists] where node_id= @new_parent_node_id;
        select @index = charindex('.json',@copy_node_name);
        if(@index> 0)
         select @new_copy_node_name = substring(@copy_node_name,1,len(@copy_node_name)-5);
        else
         set @new_copy_node_name = @copy_node_name;
    --对移动的父节点进行修改
        if ( @copy_node_name !=''  and  @copy_node_name is not null)
            exec('insert  into   [dbo].[d_dir_lists]   select   project_id ,'''+@copy_node_name+''','''+@new_parent_node_url+'/'+@new_copy_node_name+''',node_content,'+@new_parent_node_id+',node_type,1,getdate(),'+@user_id+',getdate(),'+@user_id+',remark  from  [dbo].[d_dir_lists] where  node_id='+@node_id);        
        else
            exec('insert  into   [dbo].[d_dir_lists]   select   project_id ,node_name,'''+@new_parent_node_url+'/'+@new_copy_node_name+''',node_content,'+@new_parent_node_id+',node_type,1,getdate(),'+@user_id+',getdate(),'+@user_id+',remark from  [dbo].[d_dir_lists] where  node_id='+@node_id);    
    --得到产生的随机ID
        [color=#FF0000]select @new_node_id=IDENT_CURRENT('d_dir_lists');[/color]
         [color=#3366FF] --上面这段为什么我换成 select @new_node_id=SCOPE_IDENTITY();就会出错?这个函数受什么限制吗?[/color]        print @new_node_id
        exec ('exec [dbo].[copy_insert]'+ @node_id+','+@new_node_id+','+@user_id);
    --调用函数返回树型json对象
        select '['+dbo.TreePrint(@new_node_id)+']' as json;
end


------解决方案--------------------
看下联机帮助,SCOPE_IDENTITY和IDENT_CURRENT区别说的很清楚

exec相当于另一个连接

------解决方案--------------------
作用域的问题,exec相当于另一个作用域,SCOPE_IDENTITY只能取得当前作用域的最后插入的值,也就是说他没有办法获取由exec执行的语句的id值。
http://msdn.microsoft.com/zh-cn/library/ms190315.aspx