有一段时间我一直在搜索我的资源,以便重新分配Cursors SELECT语句但没有成功。
首先让我告诉你我到目前为止的代码:
@KeyString - 存储以逗号分隔的ID列表 @Individual - 在@KeyString被分解后存储个人ID。
DECLARE @Keystring VarChar(100) = '4, 6'
DECLARE @Individual VarChar(10)
WHILE LEN(@KeyString) > 1
BEGIN
IF PATINDEX('%, %', @KeyString) > 1
BEGIN
SET @Individual = SUBSTRING(@KeyString, 0, (PATINDEX('%, %', @KeyString)))
END
ELSE
BEGIN
SET @Individual = @KeyString
END
IF NOT CURSOR_STATUS('global', 'ID_Cursor')>= -1
BEGIN
DECLARE ID_Cursor Cursor
FOR
SELECT Blah FROM tbl_Blah WHERE ID = @Individual
OPEN ID_Cursor
END
ELSE
BEGIN
/*RESET ID_Cursor = SELECT Blah FROM tbl_Blah WHERE Keyword = @Individual
(The Next @Individual after first loop)*/
END
FETCH NEXT FROM ID_Cursor INTO @blah
WHILE @@FETCH_STATUS = 0
BEGIN
......
FETCH NEXT FROM ID_Cursor INTO @blah
END
/*Loops Back to 'While LEN(@KeyString) > 1*/
END
不知何故,我需要为ID_Cursor分配一个新的SELECT语句。 ID_Cursor需要在循环后使用下一个@Individual返回。
有几种方法我认为这是可能的:
如何在代码中显示:
IF NOT ID_Cursor already exist Then
Create ID_Cursor
Else
Change ID Cursor
End
在循环外声明ID_Cursor并用以下内容替换整个IF语句('IF NOT CURSOR_STATUS('global,'ID_Cursor')> = -1):
SET CURSOR FOR SELECT Blah FROM tbl_Blah WHERE Keyword = @Individual
或以某种方式删除ID_Cursor,当它'循环返回'而LEN(@KeyString)> 1'并且每次都宣布它?
问题是我还没有找到关于重新分配游标并再次执行游标的文档/语法。在重新分配之前,我是否必须先清除光标数据?
表结构:
Tbl_Main(ID int,Error_Title varchar,Error_Description varchar,K_ID varchar)
示例行:1 |电子邮件不发送|请联系您的管理员| 4,6,
Tbl_Keyword(ID int,Keyword varchar) 示例行:
4 |电子邮件
6 |观
Temp_Table(Main_ID int,Keyword_Count int)本地临时表仅存在于该一个连接
示例行:1 | 2
我的项目是一个错误日志系统,就像在Stack Overflow上使用标签一样,用户会分配一个与他们的问题相关的错误关键字,以便将来快速轻松地搜索相关问题。
对数据库的这种特殊调用是基于这些关键字的搜索。例如:用户将在VB中选择“电子邮件”和“Outlook”,然后@keystring将填充“4,6”。
在这个例子中,由于@keywords中有2个关键字,第一个阶段是将它们分解为单独的Keyword_ID。这就是@Individual的用途。对于此示例,@ individual = 4(对于第一个循环)。一旦我有了个人ID,我就需要运行'SELECT ID FROM tbl_Main WHERE Keyword_ID Like'%'+ @Individual +'%';'对于这个SELECT语句返回的每个ID,我需要检查并查看ID已经存在于我的temtable中。如果它还不存在,我将需要INSERT INTO temp_table(@individual (因为这是来自tbl_main的ID),1 (因为这是temp_table中此ID的第一个实例) ))。例如:@individual = 4和tbl_main中ID = 1的错误在Keyword_ID中包含'4',因此在temp_table中,ID将为1,计数将为1.
在第二个循环中@individual将等于6(用户正在搜索的第二个ID),因为我的temp_table中已经存在ID = 1的错误,并且其Keyword_ID中包含'6',temp_table将需要更新未插入(UPDATE Keyword_Count WHERE ID = @Individual)一旦完成此特定行将看起来像(1 | 2)(1因为它是ID | 2,因为它包含用户选择的2个ID) 最后,一旦搜索到所有单个错误,我将把Keyword_Count DESC排序的temp_table返回给VB并用这些数据填充列表视图。这意味着您搜索的最可能的错误将在列表中显示为第一,因为它会计算搜索的大多数关键字。
这就是我的总体目标:返回tbl_main中包含最多搜索的keyword_ID的行,按最大的顺序排序。
答案 0 :(得分:2)
感谢您的回复。所以。忘了你的SP。如果我理解了这个问题,这就是你所需要的:
DECLARE @keystrings varchar(max)
SET @keystrings='4, 6' --your example
SET @keystrings=REPLACE(@keystrings, ' ', '') --remove spaces, we don't need them
SET @keystrings=CONCAT('SELECT ', REPLACE(@keystrings, ',', ' UNION ALL SELECT '))
SELECT TBM.ID, count(TBM.ID) AS 'HitCount'
FROM Tbl_Main AS TBM
WHERE TBM.K_ID IN (@keystrings)
GROUP BY TBM.ID
您可以在即时窗口中尝试此操作(SSMS的“新查询”窗口)。让我知道它是否正确并解释为什么/您需要的其他结果