Невозможно возвратить учетную запись с хранимой процедурой с объявлением в ней - PullRequest
1 голос
/ 28 февраля 2011

Я написал хранимую процедуру для возврата записи, но как только я объявляю переменную, мой классик asp не может подсчитать общий набор записей, он всегда возвращает -1

Если у кого-то есть решение этой проблемы, это значительно облегчит мою работу, и ваш вклад будет принят с благодарностью.

Хранимый код процедуры для SQL Server 2000

CREATE PROCEDURE sp_SalesTaxV3(
    @ship_zip varchar(20)
)
AS
   --problem  if in enable the next 2 lines
   DECLARE @tax_rate INT
   set @tax_rate =0
   --disable the above 2 line the asp will able to count.   
   --end problem
BEGIN
    SELECT * FROM tax_rate where  zip =''+@ship_zip+''  
END

ASP Classic код:

<%
set strGetTaxZips = Server.CreateObject("ADODB.RecordSet")
strSQLGetTaxZips = "EXECUTE sp_SalesTaxV3 '"&user_zip &"'"
Response.Write(strSQLGetTaxZips)
strGetTaxZips.Open strSQLGetTaxZips,tax_db,3
Response.Write("<BR>recordcount" &strGetTaxZips.recordcount)
%>

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Я бы попытался поставить DECLARE после BEGIN:

CREATE PROCEDURE sp_SalesTaxV3(@ship_zip varchar(20))
AS BEGIN
   DECLARE @tax_rate INT
   SET @tax_rate = 0

   SELECT * FROM tax_rate WHERE zip = ''+@ship_zip+''  
END
0 голосов
/ 28 февраля 2011

Вам нужно включить Set NoCount On; в начале вашей хранимой процедуры.Вероятно, проблема заключается в том, что что-то вызывает возврат списка затронутых строк, и это отбрасывает классический ADO, и он считает, что затронутые строки - это первый набор записей.

Если проблема заключается в получении точного значения свойства RecordCount в RecordSet, то тип используемого курсора имеет значение.В вашем примере вы используете статический курсор, передавая «3» в метод Open.Используя статический курсор, вам нужно вызвать MoveLast, прежде чем RecordCount будет точным.

Const adOpenForwardOnly = 0
Const adOpenStatic = 3
Dim sql
Dim rs

' btw, you should validate your inputs here
sql = "Exec sp_SalesTaxV3 '" & user_zip & "'"

Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open sql, tax_db, adOpenStatic
rs.MoveLast
rs.MoveFirst  'not needed if you are not going to cycle through the rows

'Now RecordSet will be accurate
Response.Write( "<br />RecordCount: " & rs.RecordCount )

Set rs = Nothing

Кстати, другое решение состоит в том, чтобы просто возвращать счетчик строк в виде столбца в выходных данных (или просто счетчик, если вы не собираетесь использовать ни одну из возвращенных строк).*

...