0

一段时间以来,我一直在寻找我的资源以寻找重新分配 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。

有几种方法我认为这是可能的:

  1. 它在代码中的显示方式:

                IF NOT ID_Cursor already exist Then
                Create ID_Cursor
                Else
                Change ID Cursor
                End
    
  2. 在循环外声明 ID_Cursor 并将整个 IF 语句 ('IF NOT CURSOR_STATUS('global, 'ID_Cursor')>= -1) 替换为:

                SET CURSOR FOR SELECT Blah FROM tbl_Blah WHERE Keyword = @Individual
    
  3. 或者以某种方式删除 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 的行,按最大的第一个排序。

4

1 回答 1

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“新查询”窗口)中尝试此操作。让我知道它是否不正确并解释为什么/您需要什么其他结果

于 2013-04-25T14:12:47.713 回答