用存储过程插入数据create proc insertdata @date datetime, ... @id int output as insert tablename(...) values (...)select @id=SCOPE_IDENTITY ()go
以前是ACCESS数据库使用以下就可以,可是升级到SQL以后就无法调用到ID rs("date")=savetime rs.update if request("makehtml")="yes" then temp = rs.book rs.book = temp newid=rs.Fields("ID") end if
我看过一些朋友的相同问题,可是都无法将ID 调用出来. 就是要实现 当将一条新数据加入数据库以后在取出这条数据的ID 来执行下一步程序工作. 以下是程序: sql="select * from infoprice where (id is null)" rs.open sql,conn,1,3 rs.addnew rs("tid")=request("tid") rs("se")=request("se") rs("title")=request("title") rs("form_user")=request("form_user") rs("form_url")=request("form_url") rs("fpath")=cstr(year(now())&"-"& month(now())) rs("fname")=fname if request("html")="yes" then ' rs("info")=request("body") rs("info")=winwaa else rs("info")=winwaa end if id=rs("id") rs("date")=savetime rs.update if request("makehtml")="yes" then response.redirect "info_makeinfo.asp?type=page&id="&id&"&tid="&request("tid")
如果考虑多用户迸发,最好是另设一张表,放置各种单据类型的当前最大ID号,然后通过一个存储过程来取得这个ID号,那么对于你来说,ID号就是可控的了。 下面是我做过的程序中的一段代码,仅为参考:表-- CREATE TABLE [dbo].[ReceiptMaxNo] ( [lngReceiptMaxNoID] [int] IDENTITY (1, 1) NOT NULL , [lngReceiptTypeID] [int] NOT NULL , [strReceiptNO] [nvarchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL , [lngReceiptNO] [int] NOT NULL ) ON [PRIMARY]存储过程-- --获取新编号的存储过程 CREATE PROC e_GetNextCode @lngReceiptMaxNoID INT=0, @lngReceiptTypeID INT, @strReceiptNO NVARCHAR(6)=N'', @lngReceiptNO INT=0, @IsMarkDate INT=0, @strNextCode NVARCHAR(30)=N'' OUTPUT, @lngErrCode INT=0 OUTPUTASDECLARE @SQL NVARCHAR(4000)SET @strNextCode=CONVERT(NVARCHAR(10),GETDATE(),112)+N'-'BEGIN TRAN UPDATE ReceiptMaxNo SET lngReceiptNO=lngReceiptNO+1 WHERE lngReceiptTypeID=@lngReceiptTypeID SET @SQL=N'SELECT @strNextCode= (strReceiptNO+ @strNextCode+CAST((100000+lngReceiptNO) AS NVARCHAR(30))) FROM ReceiptMaxNo WHERE lngReceiptTypeID=@lngReceiptTypeID' EXEC SP_EXECUTESQL @SQL, N'@strNextCode NVARCHAR(30) OUTPUT,@lngReceiptTypeID INT', @strNextCode OUTPUT,@lngReceiptTypeID
IF CAST(RIGHT(@strNextCode,5) AS INT)<100000 SET @strNextCode= STUFF(@strNextCode,CHARINDEX('-',@strNextCode)+1,1,'0') IF @@ERROR >0 BEGIN ROLLBACK TRAN SET @lngErrCode=820 RETURN END ELSE BEGIN SET @lngErrCode=0 COMMIT TRAN END GO
非常感谢fyming,我在调试一下,很希望能交你这样的高手朋友,我的QQ是59922383
to fyming: 如果考虑多用户迸发,最好是另设一张表,放置各种单据类型的当前最大ID号咨询一下:如果多用户以极高频率并发,会不会造成你这个表被锁?插入前或插入后,肯定要到你这个表取最大ID并更新的吧。 我没有测试过,不过听说在这种情况下,用系统自增的会好点。特此求证。
用insert触发器吧.create trigger trg_ins on [table1] after insert begin select @@identity end在客户端执行Insert SQL时,采用可以得到记录集的执行方式,取得的记录集就是新插入的id.
To:ww3347(新来的) 以下纯属技术讨论,欢迎其他兄弟加入:)“如果多用户以极高频率并发”,在这种情况下,更不能用“系统自增”了,你想啊,刚插入一条记录,然后去取IDENTITY,但在你取之前的空隙,很有可能其他用户又插入了一条,那你取得的IDENTITY其实并不是你想要的。“如果多用户以极高频率并发”,频率会高到什么程序?我们在编程的时候可能会根据实际情况进行处理。比如一个50个用户的局域网络,也可以这样做,在表中除了设置种子标识列之外,再另设USERS(操作员)和dateEditTime(编辑时间),插入记录之后,用一条SETECT ID FROM T WHERE USERS=* AND dateEditTime=*”来得到ID,原理是:同一操作员在同一时间总没可能同时做两笔以上的记录吧。但问题又来了,如果在不同的电脑上用同一操作员的用户名登录并且操作,如何处理?dateEditTime要精确到什么程度?小时、分还是秒? 没有哪个程序语言可以完美地解决所有的问题,高级语言如此,更不说数据库语言了。如果系统自增的能够解决问题,那当然最好,谁也不想自找麻烦,兜一个大圈。
@date datetime,
...
@id int output
as
insert tablename(...) values (...)select @id=SCOPE_IDENTITY ()go
rs.update
if request("makehtml")="yes" then
temp = rs.book
rs.book = temp
newid=rs.Fields("ID")
end if
另外,
temp = rs.book
rs.book = temp
这两句也不明白,赋值一个书签又取得这个书签,有什么意义?
就是要实现
当将一条新数据加入数据库以后在取出这条数据的ID 来执行下一步程序工作.
以下是程序:
sql="select * from infoprice where (id is null)"
rs.open sql,conn,1,3
rs.addnew
rs("tid")=request("tid")
rs("se")=request("se")
rs("title")=request("title")
rs("form_user")=request("form_user")
rs("form_url")=request("form_url")
rs("fpath")=cstr(year(now())&"-"& month(now()))
rs("fname")=fname
if request("html")="yes" then
' rs("info")=request("body")
rs("info")=winwaa
else
rs("info")=winwaa
end if id=rs("id")
rs("date")=savetime
rs.update
if request("makehtml")="yes" then
response.redirect "info_makeinfo.asp?type=page&id="&id&"&tid="&request("tid")
SELECT ID=SCOPE_IDENTITY()
或者
SELECT ID=@@IDENTITY
下面是我做过的程序中的一段代码,仅为参考:表--
CREATE TABLE [dbo].[ReceiptMaxNo] (
[lngReceiptMaxNoID] [int] IDENTITY (1, 1) NOT NULL ,
[lngReceiptTypeID] [int] NOT NULL ,
[strReceiptNO] [nvarchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[lngReceiptNO] [int] NOT NULL
) ON [PRIMARY]存储过程--
--获取新编号的存储过程
CREATE PROC e_GetNextCode
@lngReceiptMaxNoID INT=0,
@lngReceiptTypeID INT,
@strReceiptNO NVARCHAR(6)=N'',
@lngReceiptNO INT=0,
@IsMarkDate INT=0,
@strNextCode NVARCHAR(30)=N'' OUTPUT,
@lngErrCode INT=0 OUTPUTASDECLARE @SQL NVARCHAR(4000)SET @strNextCode=CONVERT(NVARCHAR(10),GETDATE(),112)+N'-'BEGIN TRAN
UPDATE ReceiptMaxNo
SET lngReceiptNO=lngReceiptNO+1
WHERE lngReceiptTypeID=@lngReceiptTypeID
SET @SQL=N'SELECT @strNextCode= (strReceiptNO+ @strNextCode+CAST((100000+lngReceiptNO) AS NVARCHAR(30)))
FROM ReceiptMaxNo
WHERE lngReceiptTypeID=@lngReceiptTypeID' EXEC SP_EXECUTESQL @SQL,
N'@strNextCode NVARCHAR(30) OUTPUT,@lngReceiptTypeID INT',
@strNextCode OUTPUT,@lngReceiptTypeID
IF CAST(RIGHT(@strNextCode,5) AS INT)<100000 SET @strNextCode= STUFF(@strNextCode,CHARINDEX('-',@strNextCode)+1,1,'0') IF @@ERROR >0
BEGIN
ROLLBACK TRAN
SET @lngErrCode=820
RETURN
END
ELSE
BEGIN
SET @lngErrCode=0
COMMIT TRAN
END
GO
如果考虑多用户迸发,最好是另设一张表,放置各种单据类型的当前最大ID号咨询一下:如果多用户以极高频率并发,会不会造成你这个表被锁?插入前或插入后,肯定要到你这个表取最大ID并更新的吧。
我没有测试过,不过听说在这种情况下,用系统自增的会好点。特此求证。
after insert
begin
select @@identity
end在客户端执行Insert SQL时,采用可以得到记录集的执行方式,取得的记录集就是新插入的id.
没有哪个程序语言可以完美地解决所有的问题,高级语言如此,更不说数据库语言了。如果系统自增的能够解决问题,那当然最好,谁也不想自找麻烦,兜一个大圈。
我今天才看到你的回复,我也是使用这种方式解决的.