2010-10-06 3 views
4

Каков наиболее эффективный способ возврата логического (истинного/ложного) из хранимой процедуры T-SQL? Я хочу, чтобы он выполнял запрос и возвращал, удалось ли это или нет. Я звоню через ASP.Возврат логического значения из хранимой процедуры T-SQL

Позвольте мне уточнить, что я делаю.

Если запись существует в таблице (с указанием того, что документ уже зарезервирован и не может быть извлечен), я хочу уведомить пользователя на лицевой стороне. Я определю это, проверив Exists ... в T-SQL и затем каким-то образом вернув это обратно в Classic ASP (возвращаемое значение, параметр, поле набора записей).

Получает ли это какой-либо ответ более разумным?

+0

самый эффективный или самый распространенный? –

+3

не используют логическое значение, чтобы определить, был ли запрос выполнен. как вы ЗНАЕТЕ, что преуспели из кода SP? Лучшим решением было бы проверить код ошибки @@ ERROR – RPM1984

+0

Кроме того, вы должны указать, что определяет «успех» в этой ситуации. Означает ли это, что запрос просто не ошибся? Что он затронул> 0 строк? Или ...? – Dane

ответ

1

У меня есть эта функция в ASP, которая предполагает, что SP принимает последний параметр как целочисленное выходное значение.

Возвращение и целое число лучше, потому что вы можете вернуть несколько состояний, а не только true/false.

Function RunSPReturnInteger(strSP , params()) 
    On Error resume next 

    ''// Create the ADO objects 
    Dim cmd 
    Set cmd = server.createobject("ADODB.Command") 

    ''// Init the ADO objects & the stored proc parameters 
    cmd.ActiveConnection = GetConnectionString() 
    cmd.CommandText = strSP 
    cmd.CommandType = adCmdStoredProc 

    ''// propietary function that put the params in the cmd 
    collectParams cmd, params 

    ''// Assume the last parameter is outgoing 
    cmd.Parameters.Append cmd.CreateParameter("@retval", adInteger, adParamOutput, 4) 

    ''// Execute without a resulting recordset and pull out the "return value" parameter 
    cmd.Execute , , adExecuteNoRecords 
    If err.number > 0 then 
     BuildErrorMessage() 
     exit function 
    end if 
    RunSPReturnInteger = cmd.Parameters("@retval").Value 

    ''// Disconnect the recordset, and clean up 
    Set cmd.ActiveConnection = Nothing 
    Set cmd = Nothing 

    Exit Function 
End Function 
1

Возврат bit: «целочисленный тип данных, который может принимать значение 1, 0 или NULL».

+0

Вы читали [почему у Oracle нет типа данных BIT/BOOLEAN] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6263249199595) ? –

+1

@OMG: Хорошее горе, это восемь лет обсуждения. В конце концов, я думаю, что я согласен с Джереми: «Если значение, которое я пытаюсь сохранить на самом деле, является логическим, тогда, когда я смотрю на свою модель, ясно, что это то, что есть в столбце». –

+0

@OMG Похоже, что у Oracle нет булева типа данных, потому что они чрезвычайно упрямы. –

1

Неплохая идея.

Возвращаемое значение, выходной параметр или набор записей будут неопределенными или не заданными или частичными, если у вас есть ошибка. Например, ошибка CAST прерывает код (без TRY/CATCH).

Гораздо лучший метод будет опираться на обработку исключений, например:

BEGIN TRY 
    ... 
    --assume worked 
END TRY 
BEGIN CATCH 
    DECLARE @foo varchar(2000) 
    SET @foo = ERROR_MESSAGE() 
    RAISERROR (@foo, 16,1) 
END CATCH 

Однако, я подозреваю, что я мог бы ответить на ваш вопрос позже о «почему не SQL Server делать ...?». ..

+0

Я, как правило, согласен, но ловить ошибки - такая боль как в T-SQL, так и в классическом ASP. –

+1

@Eduardo Molteni: Почему ловушка ошибок в Pian в SQL сейчас? – gbn

+0

IMO: Слишком многословно и сложно отлаживать. Но главная проблема на стороне ASP Classic. –

Смежные вопросы