【问题标题】:ADODB.Recordset error '800a0e78 Operation is not allowed when the object is closed: stored proc against temp table requiring SET NOCOUNT ONADODB.Recordset 错误'800a0e78 对象关闭时不允许操作:针对需要 SET NOCOUNT ON 的临时表存储的过程
【发布时间】:2011-08-03 12:13:51
【问题描述】:

我正在使用 SQL Server 2008 探索全文索引搜索并遇到两组错误。

它源于我用 VBScript 调用的一个存储过程,它生成的会生成搜索命中列表记录集。存储过程在 SQL Server Management Studio 中运行良好,基本上会生成一个搜索命中列表。参数是关键字和突出显示的样式。

最初的错误:

错误一: ADODB.Recordset error '800a0e78 Operation is not allowed when the object is close

在 ASP 代码中的 If not recordset.EOF 行。然后进行一些阅读和搜索,发现 SET NOCOUNT ON; 尤其是在引用临时表时 (KB235340)。

但是,当我指定 SET NOCOUNT ON 时,我得到了“错误二”中列出的错误。 NB 关于权限我已将 EXECUTE 权限分配给运行存储过程的帐户以突出显示搜索命中。

错误二: Microsoft OLE DB Provider for SQL Serve 错误“80040e14” 用户无权执行此操作

添加SET NOCOUNT ON时出现错误二。

ASP 代码:导致错误的行被突出显示

    Dim cmd
    Dim newParameter
    Dim recordset
    Dim SearchTerm
    Dim Style

    SearchTerm = ""
    SearchTerm = Request("searchTerm")
    Style = "background-color:yellow; font-weight:bold"

    Dim objConnectionMICenter
    Set objConnectionMICenter = Server.CreateObject("ADODB.Connection") 
    objConnectionMICenter.Open Session("ConnectMICenter") 

    Set cmd  = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = objConnectionMICenter

   ' Define the stored procedure's inputs and outputs
   ' Question marks act as placeholders for each parameter for the
   ' stored procedure
   cmd.CommandType = 4 ' adCmdStoredProc
   cmd.CommandText = "HelpAndCalculationNoteHighlight"

    '--- Create and append parameter for SearchTerm 
    Set newParameter = cmd.CreateParameter("SearchTerm",203 ,1,100,SearchTerm)
    cmd.Parameters.Append newParameter

    '--- Create and append parameter for SearchTerm 
    Set newParameter = cmd.CreateParameter("Style",203 ,1,200,Style)
    cmd.Parameters.Append newParameter

    Set recordset = cmd.Execute()

     **If not recordset.EOF Then**
        While Not recordset.EOF
            response.Write "<div>" & recordset.Fields("Snippet") & "</div>"
            recordset.MoveNext
        Wend
    end if

    Response.Write strPreviewContents

    Set objConnectionMICenter = Nothing
    Set newParameter = Nothing
    Set cmd = Nothing

    recordset.Close
    Set recordset = Nothing

存储过程:

ALTER PROCEDURE [dbo].[HelpAndCalculationNoteHighlight]
@SearchTerm nvarchar(100),
@Style nvarchar(200)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

CREATE TABLE #match_docs
(
doc_id bigint NOT NULL PRIMARY KEY
);

INSERT INTO #match_docs
(
doc_id
)
SELECT DISTINCT
id
FROM IntegratedHelpNotes_ChildSectionPage
WHERE FREETEXT
(
content,
@SearchTerm,
LANGUAGE N'English'
);

-- Begin Second Block
DECLARE @db_id int = DB_ID(),
@table_id int = OBJECT_ID(N'IntegratedHelpNotes_ChildSectionPage'),
@column_id int =
(
SELECT
column_id
FROM sys.columns
WHERE object_id = OBJECT_ID(N'IntegratedHelpNotes_ChildSectionPage')
AND name = N'content'
);

-- Begin Third Block
SELECT
    s.id,
    MIN
    (
        N'...' + SUBSTRING
        (
            REPLACE
                (   
                    c.content,
                    s.Display_Term,
                    N'<span style="' + @Style + '">' + s.Display_Term + '</span>'
                ),
            s.Pos - 512,
            s.Length + 1024
        ) + N'...'
    ) AS Snippet
    FROM
    (
        SELECT DISTINCT
            c.id,
            w.Display_Term,
            PATINDEX
                (
                    N'%[^a-z]' + w.Display_Term + N'[^a-z]%',
                    c.content
                ) AS Pos,
            LEN(w.Display_Term) AS Length
        FROM sys.dm_fts_index_keywords_by_document
            (
                @db_id,
                @table_id
            ) w
        INNER JOIN dbo.IntegratedHelpNotes_ChildSectionPage c
            ON w.document_id = c.id
            WHERE w.column_id = @column_id
                AND EXISTS
                    (
                        SELECT 1
                        FROM #match_docs m
                        WHERE m.doc_id = w.document_id
                    )
                AND EXISTS
                (
                    SELECT 1
                    FROM sys.dm_fts_parser
                        (
                            N'FORMSOF(FREETEXT, "' + @SearchTerm + N'")',
                            1033,
                            0,
                            1
                        ) p
                    WHERE p.Display_Term = w.Display_Term
                    )
                ) s
            INNER JOIN dbo.IntegratedHelpNotes_ChildSectionPage c
            ON s.id = c.id
            GROUP BY
            s.id;
DROP TABLE #match_docs;
END;

【问题讨论】:

    标签: sql-server-2008 asp-classic ado


    【解决方案1】:

    您使用的 sys.dm 视图需要提升权限

    正如您所提到的,您使用了 2 组不同的凭据。

    您是 SSMS 中的系统管理员和 vb 脚本中的普通用户。

    您可以在存储过程中尝试“EXECUTE AS OWNER”。或者尝试将 sys.dm_fts_parser 包装在 master 的视图中(也可以使用 EXECUTE AS OWNER)

    【讨论】:

    • 干杯伙伴。经过数小时的挫折后找到解决方案非常令人欣慰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多