当前位置: 代码迷 >> Sql Server >> SCOPE_IDENTITY()的疑惑,该如何处理
  详细解决方案

SCOPE_IDENTITY()的疑惑,该如何处理

热度:68   发布时间:2016-04-27 12:28:47.0
SCOPE_IDENTITY()的疑惑
SQL code
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOALTER 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_iddeclare @new_node_id intbegin        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 ,[email protected]_node_name+''',[email protected][email protected]_copy_node_name+''',node_content,[email protected]_parent_node_id+',node_type,1,getdate(),[email protected]_id+',getdate(),[email protected]_id+',remark  from  [dbo].[d_dir_lists] where  [email protected]_id);                else            exec('insert  into   [dbo].[d_dir_lists]   select   project_id ,node_name,[email protected][email protected]_copy_node_name+''',node_content,[email protected]_parent_node_id+',node_type,1,getdate(),[email protected]_id+',getdate(),[email protected]_id+',remark from  [dbo].[d_dir_lists] where  [email protected]_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+',[email protected]_node_id+',[email protected]_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