Sql Can';t返回包含声明的存储过程的recordcount

Sql Can';t返回包含声明的存储过程的recordcount,sql,sql-server,asp-classic,sql-server-2000,Sql,Sql Server,Asp Classic,Sql Server 2000,我编写了一个存储过程来返回记录,但只要我声明一个变量,我的asp classic就无法计算整个记录集,它总是返回-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

我编写了一个存储过程来返回记录,但只要我声明一个变量,我的asp classic就无法计算整个记录集,它总是返回-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经典代码:

<%
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)
%>

我会尝试将
声明
放在
开始之后

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

我会尝试将
声明
放在
开始
之后:

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

您需要包括
Set NoCount On位于存储过程的顶部。问题很可能是由于某种原因导致返回受影响的行列表,这会使经典的ADO失效,它认为受影响的行是第一个记录集

CREATE PROCEDURE sp_SalesTaxV3 ( @ship_zip varchar(20) )
AS 
Begin
    Declare @tax_rate int

    Set NoCount On

    Set @tax_rate = 0

    Select * 
    From tax_rate 
    Where zip = @ship_zip
End
添加

如果问题是获取记录集上RecordCount属性的准确值,则使用的光标类型会有所不同。在您的示例中,通过向Open方法传递“3”来使用静态游标。使用静态游标,您需要在RecordCount准确之前调用MoveLast

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

您需要包括
Set NoCount On位于存储过程的顶部。问题很可能是由于某种原因导致返回受影响的行列表,这会使经典的ADO失效,它认为受影响的行是第一个记录集

CREATE PROCEDURE sp_SalesTaxV3 ( @ship_zip varchar(20) )
AS 
Begin
    Declare @tax_rate int

    Set NoCount On

    Set @tax_rate = 0

    Select * 
    From tax_rate 
    Where zip = @ship_zip
End
添加

如果问题是获取记录集上RecordCount属性的准确值,则使用的光标类型会有所不同。在您的示例中,通过向Open方法传递“3”来使用静态游标。使用静态游标,您需要在RecordCount准确之前调用MoveLast

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

HTML编辑器发生了什么,它没有显示在这个网站上。为什么要将空字符串连接到@ship_zip?既然它已经是一个字符串,为什么不简单地使用
zip=@ship\u zip
?HTML编辑器发生了什么事情,它不会出现在这个网站上。为什么要将空字符串连接到@ship\u zip?既然它已经是一个字符串,为什么不简单地使用
zip=@ship\u-zip
?发现了一些提示@Darwin:愚蠢的问题:如果你只设置变量,但从不在任何地方以任何方式、形状或形式使用它-为什么还要麻烦它?发现了一些提示@Darwin:愚蠢的问题:如果你只设置变量,但从不在任何地方以任何方式使用它,形状或形式——为什么还要费心呢?我已经习惯了。我试着不计较;而且也不算抵销;我必须使用这个代码来解决这个问题。如果不是strGetTaxZips.eof,则…结束if@Darwin-是不是记录集的BOF和EOF都是真的(即-1)?哈哈,那是速记代码。根据w3schools.com,如果当前记录位置在记录集中最后一条记录之后,则EOF属性返回True(-1),否则返回False(0)。如果当前记录位置在记录集中的第一条记录之前,则BOF属性返回True(-1),否则返回False(0)。@Darwin-仔细查看代码,您使用的是静态游标(记录集Open方法调用中的“3”)。这意味着您需要先调用MoveFirst才能到达第一行。如果你想要记录计数,你需要在记录计数准确之前移动最后一个。@Darwin-我已经更新了我的答案。我认为问题是你需要最后一个行动。顺便说一句,如果您想要的只是计数,那么您显然可以更改存储过程,将计数返回给您,而不是获取所有行并计算您得到的行数。我也已经提到了这一点。我试着不计较;而且也不算抵销;我必须使用这个代码来解决这个问题。如果不是strGetTaxZips.eof,则…结束if@Darwin-是不是记录集的BOF和EOF都是真的(即-1)?哈哈,那是速记代码。根据w3schools.com,如果当前记录位置在记录集中最后一条记录之后,则EOF属性返回True(-1),否则返回False(0)。如果当前记录位置在记录集中的第一条记录之前,则BOF属性返回True(-1),否则返回False(0)。@Darwin-仔细查看代码,您使用的是静态游标(记录集Open方法调用中的“3”)。这意味着您需要先调用MoveFirst才能到达第一行。如果你想要记录计数,你需要在记录计数准确之前移动最后一个。@Darwin-我已经更新了我的答案。我认为问题是你需要最后一个行动。顺便说一句,如果您想要的只是计数,那么显然可以更改存储的进程,将计数返回给您,而不是获取所有行并计算得到的行数。