重新分配游标SELECT语句。 SQL Server 2008

时间:2013-04-25 09:55:58

标签: sql sql-server-2008 cursor

有一段时间我一直在搜索我的资源,以便重新分配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,当它'循环返回'而LEN(@KeyString)> 1'并且每次都宣布它?

  4. 问题是我还没有找到关于重新分配游标并再次执行游标的文档/语法。在重新分配之前,我是否必须先清除光标数据?


    表结构:

    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的行,按最大的顺序排序。

1 个答案:

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