问题描述
我在使用 sql Server 和 ASP Classic 从存储过程输出结果时遇到问题。如果我有一个简单的 SELECT
到程序中,它工作正常。但是使用此处显示的代码,我收到错误消息。
我在 sql Server 中有这个存储过程:
ALTER PROCEDURE [dbo].[Sp_Teste]
@data varchar(8)
AS
BEGIN
--DROP TABLE IF EXISTS #TempSubs
DECLARE @TempSubs TABLE
(
PedidoID Int,NumeroPedido Varchar(20),SubstituidoPor Varchar(8000)
)
INSERT INTO @TempSubs (PedidoID,NumeroPedido,SubstituidoPor)
SELECT
P.ID,P.NumeroPedido,STRING_AGG(CAST(IPA.Quantidade AS varchar(5)) + 'X ' + Pd.Nome,',') + ' por ' + STRING_AGG(CAST(IPA.Quantidade AS varchar(5)) + 'X ' + Pd2.Nome,') AS SubstituidoPor
FROM
Pedidos P,Clientes C,Produtos Pd,ItensPedidosAjustado IPA,Produtos Pd2
WHERE
P.ID = IPA.PedidoId
AND P.ClienteId = C.ID
AND Pd.ID = IPA.ProdutoId
AND Faltante = 1
AND CONVERT(Date,P.DataPedido,103) = CONVERT(Date,@data,103)
AND (IPA.ProdutoSubstituidoId <> 0)
AND Pd2.ID = IPA.ProdutoSubstituidoId
AND ((P.StatusPedido <> 'Pause' AND P.StatusPedido <> 'PULOU ENTREGA' AND P.StatusPedido <> 'Pedido Cancelado') OR P.StatusPedido IS NULL)
GROUP BY
P.ID,IPA.ProdutoSubstituidoId
SELECT
(SELECT STRING_AGG(Indisponibilidade,')
FROM @TempIndis A
WHERE A.PedidoID = P.ID) AS Indisponibilidade,(SELECT STRING_AGG(SubstituidoPor,')
FROM @TempSubs A
WHERE A.PedidoID = P.ID) AS Substituicao
FROM
Pedidos P,ItensPedidosAjustado IPA
WHERE
P.ID = IPA.PedidoId
AND P.ClienteId = C.ID
AND Faltante = 1
AND CONVERT(Date,103)
AND ((P.StatusPedido <> 'Pause' AND P.StatusPedido <> 'PULOU ENTREGA' AND P.StatusPedido <> 'Pedido Cancelado') OR P.StatusPedido IS NULL)
AND P.PedidoCancelado = 0
GROUP BY
P.ID,C.Nome,C.Email,P.TipoAssinatura
ORDER BY
numeropedido
END
以及 ASP Classic 中的这段代码
db_conn = "Provider=sqlNCLI11;Server=xxxx;Database=BaseGaia;Uid=sqlserver;Pwd=xxxxx;"
set conn = server.createobject("adodb.connection")
set Cmd = Server.CreateObject("ADODB.Command")
'-------------------------------------------------------
conn.open (db_conn)
'-------------------------------------------------------
set rs = Server.CreateObject("ADODB.RecordSet")
ssql = "EXEC Sp_Teste @data = '20210301'"
set rs = conn.execute (ssql)
response.write rs.eof
我收到此错误:
ADODB.Recordset 错误 '800a0e78'
对象关闭时不允许操作。
/Atendimento/testestoreprocedure.asp,第 18 行
解决方法
默认情况下,SQL Server 在 INSERT
语句后返回 DONE_IN_PROC
(rowcount) 消息,ADO 经典返回关闭/空结果集。这些必须在 NextRecordset
查询结果可用之前通过调用 SELECT
方法来使用。
为了避免额外的编码,养成在存储过程中指定 SET NOCOUNT ON;
的习惯,以抑制那些不需要的结果。将其添加到 proc 代码的开头以避免错误。