Я изучаю полнотекстовый поиск с использованием SQL Server 2008 и сталкиваюсь с двумя наборами ошибок.
Это связано с хранимой процедурой, которую я вызываю с помощью VBScript, который генерирует набор записей списка поиска. Хранимая процедура прекрасно работает в SQL Server Management Studio и в основном генерирует список совпадений при поиске. Аргументы - это ключевое слово и стиль для выделения.
Первоначально ошибка:
Ошибка первая: Ошибка ADODB.Recordset '800a0e78 Операция не разрешена, когда объект закрыт
в строке If not recordset.EOF
в коде ASP. Затем немного чтения и поиска указали на наличие SET NOCOUNT ON;
, особенно при обращении к временным таблицам ( KB235340 ).
Однако, когда я указываю SET NOCOUNT ON
, я получаю сообщение об ошибке, указанное в «Ошибка два». Примечание: в отношении разрешений У меня есть разрешение EXECUTE, назначенное учетной записи, в которой запущена хранимая процедура для выделения результатов поиска.
Ошибка вторая: Поставщик Microsoft OLE DB для SQL-сервера Ошибка '80040e14'
У пользователя нет прав на выполнение этого действия
Ошибка 2 возникает при добавлении 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;