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

高手请进,关于插入时输出参数的问题
insert into T output inserted.t1 into @a values(...
这样的语句按理说是没有问题的,现在是这样的,我的表格名称是个变量,因此语句只能写成:

declear @strTN varchar(30) --表名变量
declare @sqlExec nvarchar(500)
declare @autoid varchar(100)
--假设表格有三列,分别是autoid(自动增长),aa int , bb int
set @sqlExec=N'insert into '+@strTN+'(aa,bb) output inserted.autoid into @vid VALUES(20,25)'
exec sp_executesql @sqlExec,N'@vid varchar(100) OUTPUT',@AUTOID output

首先,编译是没有问题的,但这句话总是不能正常运行总是提示:必须声明表变量 "@vid"

高手帮帮忙哈,我就是想返回插入的当前行的autoid,有其他的方法也可以,不过表名一定要用变量。(当然,我是不想在插入后使用查询返回autoid,这样效率较低)

------解决方案--------------------
@@IDENTITY
------解决方案--------------------
SQL code

create table TB(id int identity(1,2),A varchar(10))
insert into TB select 'asdfas'
select @@identity
/*

(1 行受影响)

---------------------------------------
1

(1 行受影响)


*/
drop table TB

------解决方案--------------------
SQL code
declear @strTN varchar(30) --表名变量 
declare @sqlExec nvarchar(500) 
declare @autoid varchar(100) 
declare @vid int OUTPUT

set @sqlExec=N'insert into '+@strTN+'(aa,bb) output inserted.autoid into @vid VALUES(20,25)' 
exec sp_executesql @sqlExec

set @vid=@@identity

------解决方案--------------------
其实只要使用@@identity即可,何必如此麻烦
------解决方案--------------------
SQL code
--关于标识列几个函数的区别

--@@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别 

@@IDENTITY--是得到当前会话的所有作用域的最后插入的IDENTITY值。 

SCOPE_IDENTITY--是得到当前会话的当前作用域的最后插入的IDENTITY值。 

IDENT_CURRENT--是得到指定表的最后插入的IDENTITY值,与会话、作用域无关。

--一个会话,就是一个用户连接。

--一个作用域就是一个模块——存储过程、触发器、函数或批处理。

=========================================

--和标识有关的几个函数。

select ident_current('tablename')--标识当前值
select ident_incr('tablename')--标识增量
select ident_seed('tablename')--标识种子

------解决方案--------------------
SQL code
if object_id('tb')is not null drop table tb
go
create table tb(autoid int identity,aa varchar(10),bb varchar(10))
declare @strTN varchar(30) --表名变量 
set @strTN='tb'
declare @sqlExec nvarchar(500) 
declare @autoid table(autoid varchar(100)) 
--假设表格有三列,分别是autoid(自动增长),aa int , bb int 
set @sqlExec=N'insert into '+@strTN+'(aa,bb) output inserted.autoid   VALUES(20,25)' 
insert @autoid exec sp_executesql @sqlExec
select * from @autoid
/*
autoid
------------------------------------
1
(1 個資料列受到影響)
*/