一段时间以来,我一直在寻找我的资源以寻找重新分配 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 当它“循环回 'While 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),因此因为 ID = 1 的错误已经存在于我的 temp_table 中并且它的 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 中包含搜索最多的关键字 ID 的行,按最大的第一个排序。