Классический ASP получает значение SCOPE_IDENTITY () из SQL2005 - PullRequest
2 голосов
/ 20 ноября 2008

Я не могу понять, как вернуть SCOPE_IDENTITY () в мои переменные из процедуры хранения SQL2005.

Моя строка sSQL:

sSQL = "EXEC [sp_NewClaim] " & Chr(34) & ClaimNumber & Chr(34) & ", " & Request.Cookies("UserID") & ", " & Request.Cookies("MasterID") & ", " & Chr(34) & strRestaurante & Chr(34) & ", " & Chr(34) &  Fecha & Chr(34) & ", " & Chr(34) & Hora & Chr(34) & ", " & Chr(34) & Request("Tiempo") & Chr(34) & ", " & Chr(34) & Request("Luz") & Chr(34) & ", " & Chr(34) & Request("Desc") & Chr(34) & ", " & Chr(34) & Request("incidente") & Chr(34) & ", " & Chr(34) & Request("codigos") & Chr(34) & ", False, 0; SELECT RecordNumber = SCOPE_IDENTITY()"

Мой вывод sSQL:

EXEC [sp_NewClaim] "W200811", 7, 8, "Otro -- WORK PLEASE", "11/19/2008", "01:19 PM", "Nublado", "Mala", "asdasd", "uyiuyui", "C-Junta", False, 0; SELECT RecordNumber = SCOPE_IDENTITY()

Выполнение моей команды SQL:

Set rsData= Server.CreateObject("ADODB.Recordset")
rsData.Open sSQL, conDB, adOpenKeyset, adLockOptimistic

Попытка вывести SCOPE_IDENTITY () создает пустую переменную (без вывода):

Response.Write("<br />Record Number: " & rsData("RecordNumber"))

Процедура сохранения выполняется правильно. Моя информация хранится в моей базе данных без проблем. RecordNumber - это столбец с идентификатором, и процедура хранения определила @RecordNumber в качестве выходного:

USE [db_clcinsurance_com]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE sp_NewClaim
 (
    @ClaimNumber nvarchar(50),
    @blah............
    .................
    @RecordNumber INT OUTPUT
    )
AS

BEGIN

    INSERT INTO Accidente (ClaimNumber,........., RecordNumber)

    VALUES (@ClaimNumber,....., @RecordNumber)

    SET @RecordNumber = SCOPE_IDENTITY();

END

Ответы [ 5 ]

5 голосов
/ 20 ноября 2008

Для вашей хранимой процедуры сделайте следующее:

CREATE PROCEDURE sp_NewClaim
 (
    @ClaimNumber nvarchar(50),
    @blah............
    .................
)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO Accidente (ClaimNumber,........., RecordNumber)
        VALUES (@ClaimNumber,....., @RecordNumber)

    SELECT SCOPE_IDENTITY()
END

И затем получите идентификатор так же, как и любой другой результат запроса.

2 голосов
/ 20 ноября 2008

Я согласен с ответом Джоэла Коухорна, но я хотел отметить, что вы отправляете свою переменную SCOPE_IDENTITY () обратно в качестве выходного параметра, но не получаете ее таким образом при вызове ado. Вы не можете получить выходной параметр, используя метод, который вы используете для вызова хранимой процедуры.

Если вам интересно, есть примеры ado здесь для вызова хранимых процедур.

0 голосов
/ 20 ноября 2008

Я согласен с Робертом. Если вы собираетесь использовать выходной параметр в вашей хранимой процедуре и вызывать его с помощью динамического SQL, в вашей сборке вам нужно будет назначить переменную SQL для выходного параметра и затем выбрать эту переменную. Вы также должны использовать ключевое слово OUTPUT при назначении переменной SQL, например:

sSQL = "DECLARE @RecNo int; EXEC [sp_NewClaim] 'param1', 'param2', etc..... @RecNo OUTPUT; SELECT @RecNo;"
0 голосов
/ 20 ноября 2008

Asp classic не моя сильная сторона, но идеи совпадают.

Проблема в том, что вы не возвращаете личность как набор записей, а как параметры OUT. Это означает, что то, как вы пытаетесь прочитать, неверно.

Попробуйте предложение Джоэла или получите его с помощью кода возврата:

Return Scope_Identity()

В качестве альтернативы вы должны создать свой запрос, используя параметры, и указать последний в качестве параметра out. Затем выполните запрос и проверьте значение последнего параметра. В .NET это будет (конвертировать в VB при необходимости):

SqlCommand cmd = new SqlCommand("INSERT INTO Foo (Description) VALUES (@Description); SET @Result = SCOPE_IDENTITY()");
SqlParameter paramDesc = new SqlParameter("@Description", SqlDbType.Int);
cmd.Parameters.Add(paramDesc);
SqlParameter paramResult = new SqlParameter("@Result", SqlDbType.Int);
paramResult.Direction = ParameterDirection.Output;
cmd.Parameters.Add(paramResult);

Я надеюсь, что вы выполняете некоторую очистку входных данных, поскольку их метод запросов очень подвержен атакам SQL-инъекций.

Rob.

0 голосов
/ 20 ноября 2008

Вы можете попробовать проверить, чтобы убедиться, что функция SCOPE_IDENTITY() работает должным образом - добавьте SELECT @RecordNumber в конец sproc и запустите ее вручную в Management Studio, чтобы убедиться, что переменная установлена ​​так, как вы ожидаете. Если это не сработает, попробуйте SELECT SCOPE_IDENTITY(), чтобы убедиться, что оно работает вообще. Наконец, жестко закодируйте значение переменной в качестве теста, чтобы убедиться, что параметр OUTPUT работает должным образом.

...