end*_*eka 3 sql sql-server asp-classic
当我尝试在 ASP 页上运行更高级的 SQL 查询时,出现以下错误:
对象关闭时不允许进行操作
当我运行此代码时,它正在工作:
...
sql = "SELECT distinct team FROM tbl_teams"
rs.open sql, conndbs, 1, 1
...
Run Code Online (Sandbox Code Playgroud)
但是当我运行此代码时(如果我在 Microsoft SQL Server Management Studio 中运行此代码则可以正常工作),我收到错误...
...
sql = "DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @orderby nvarchar(max), @currentYear varchar(4) select @currentYear = cast(year(getdate()) as varchar(4)) select @cols = STUFF((SELECT ',' + QUOTENAME(year([datefrom])) from tbl_teams group by year([datefrom]) order by year([datefrom]) desc FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') select @orderby = 'ORDER BY ['+cast(year(getdate()) as varchar(4)) + '] desc' set @query = 'SELECT team, Won = [1], Lost=[2], Draw = [3]' + @cols + ', Total from ( select team, new_col, total from ( select team, dt = year([datefrom]), result, total = count(*) over(partition by team) from tbl_teams ) d cross apply ( select ''dt'', dt union all select ''result'', case when dt = '+@currentYear+' then result end ) c (old_col_name, new_col) ) x pivot ( count(new_col) for new_col in ([1], [2], [3],' + @cols + ') ) p '+ @orderby exec sp_executesql @query"
rs.open sql, conndbs, 1, 1
...
Run Code Online (Sandbox Code Playgroud)
这是查询的更好概述:
DECLARE
@cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@orderby nvarchar(max),
@currentYear varchar(4)
select @currentYear = cast(year(getdate()) as varchar(4))
select @cols
= STUFF((SELECT ',' + QUOTENAME(year([datefrom]))
from tbl_teams
group by year([datefrom])
order by year([datefrom]) desc
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @orderby = 'ORDER BY ['+cast(year(getdate()) as varchar(4)) + '] desc'
set @query = 'SELECT team, Won = [1],
Lost=[2], Draw = [3]' + @cols + ', Total
from
(
select
team,
new_col,
total
from
(
select team,
dt = year([datefrom]),
result,
total = count(*) over(partition by team)
from tbl_teams
) d
cross apply
(
select ''dt'', dt union all
select ''result'', case when dt = '+@currentYear+' then result end
) c (old_col_name, new_col)
) x
pivot
(
count(new_col)
for new_col in ([1], [2], [3],' + @cols + ')
) p '+ @orderby
exec sp_executesql @query
Run Code Online (Sandbox Code Playgroud)
我是否需要以其他方式运行查询或者这段代码有什么问题?
这是由于与 SQL Server 一起使用时行计数被解释为存储过程的输出而导致的常见问题ADODB。
为了避免这种情况,请记住设置
SET NOCOUNT ON;
Run Code Online (Sandbox Code Playgroud)
在您的存储过程中,这将阻止 ADODB 返回关闭的记录集,或者如果出于某种原因您不想这样做(不确定为什么,因为您始终可以使用@@ROWCOUNT来传递行计数),您可以使用
'Return the next recordset, which will be the result of the Stored Procedure, not
'the row count generated when SET NOCOUNT OFF (default).
Set rs = rs.NextRecordset()
Run Code Online (Sandbox Code Playgroud)
如果 ADODB 检测到存储过程返回一个,则返回下一个(在处理多个 ADODB.Recordset 对象时ADODB.Recordset最好进行检查)。rs.State <> adStateClosed