0

我希望能够在表中插入一行,然后选择新创建的标识并将其返回到经典 asp(JScript),而无需创建存储过程。可以做到吗?

基本上是这样的:

...
rs = Server.CreateObject("ADODB.RecordSet");
rs.Open("INSERT INTO ...;SELECT SCOPE_IDENTITY() x;", objConn, ...
Response.Write(rs("x").Value);

以下工作,但相当于两次访问数据库:

...
objConn.Execute("INSERT INTO ...
rs = Server.CreateObject("ADODB.RecordSet");
rs.Open("SELECT SCOPE_IDENTITY() x;", objConn, ...
Response.Write(rs("x").Value);
4

2 回答 2

1

您可以尝试直接调用存储过程并将结果存储在数组中,如下所示:

dim rs, arr, sql
sql = "EXEC myProc"
set rs = Server.CreateObject("ADODB.Recordset") 
rs_temp.open sql, application("CONN_DISCHARGE"),3,3,1
if not (rs.bof and rs.eof) then runsql=rs.getrows
rs.close
set rs = nothing

在您的存储过程中,您可以做任何您想做的事情......

CREATE PROCEDURE myProc
AS
BEGIN
    UPDATE 
        myTable
    SET 
        myField = 42

    SELECT 
        myField 
    FROM 
        myTable 
    WHERE 
        someCondition = 1
END

- 编辑 -

有关 ASP 功能的更完整版本,请参见此处。请注意,您必须将其包含在一个单独的文件中,并在顶部使用 VB 脚本说明符(不是 JScript)才能使其正常工作。

于 2013-06-07T16:11:53.190 回答
1

我认为您首先收到受插入影响的行数,然后是标识值。您可以使用SET NOCOUNT ONrs.MoveNext在访问记录集之前使用。例如

   rs = Server.CreateObject("ADODB.RecordSet");
    rs.Open("SET NOCOUNT ON;INSERT INTO ...;SELECT SCOPE_IDENTITY() x;", objConn, ...
    Response.Write(rs("x").Value);

或者

rs = Server.CreateObject("ADODB.RecordSet");
rs.Open("INSERT INTO ...;SELECT SCOPE_IDENTITY() x;", objConn, ...
rs.MoveNext()
Response.Write(rs("x").Value);
于 2013-06-10T10:29:18.840 回答