2010-02-05 45 views
11

我创建了用户定义的函数,它将逗号分隔的字符串转换为表格。我执行此功能,像这样:SQL - 遍历表记录

select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4') 

从该查询结果如下所示:

ID 
-- 
1 
2 
3 
4 

在现实中,我想通过每一个在这个表中的行进行迭代。但是,我无法弄清楚如何做到这一点。有人能告诉我一些关于如何遍历表的行的示例SQL吗?

+2

你使用的是Oracle,SQL服务器,MySQL和...?迭代时你想做什么? – Andomar 2010-02-05 12:33:10

+1

你能描述一下你试图解决的问题吗?可以肯定的是,你不需要迭代来解决你的问题。 – 2010-02-05 12:37:46

+1

我正在使用SQL Server。我想遍历表格。 – user255048 2010-02-05 12:46:50

回答

10

文档中的SQL SERVER 2000年5月8日,你可以使用游标,如下图所示。

但是,在你走下光标路径之前,你应该先看看与SQL Server中的游标相关的问题。

DECLARE @id VARCHAR(10) 

DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR 
    SELECT [String] AS 'ID' 
    FROM [dbo].[ConvertStringToTable]('1,2,3,4') 
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @id 
WHILE @@FETCH_STATUS = 0 BEGIN 
    PRINT @id 
    -- do your tasks here 

    FETCH NEXT FROM myCursor INTO @id 

END 

CLOSE myCursor 
DEALLOCATE myCursor 
4

如果可以避免使用游标,通常所有您真正需要的就是加入到您创建的表中。如果您的光标正在进行更新,插入或删除,则有99.9%的机会不需要光标。游标应该是最后的度假胜地,而不是一种手段。遍历记录在数据库中几乎总是一个糟糕的选择。学会思考。

为什么要避免游标?因为他们创造了性能噩梦。我通过删除curosr将流程从24小时或更长时间更改为不到一分钟。

1

使用下面的函数,该函数字符串和定界符....

CREATE FUNCTION [dbo].[Udfsplitstring](@Text  VARCHAR(MAX), 
             @Delimiter VARCHAR(20) = ' ') 
-- @Strings table will contain values after separated by delimiter 
RETURNS @Strings TABLE ( 
    ID INT IDENTITY PRIMARY KEY, 
    VALUE VARCHAR(MAX)) 
AS 
    BEGIN 
     DECLARE @Index INT 

     -- Set the index to -1 prior to run index through the loop 
     SET @Index = -1 

     -- Run loop till Text becomes empty 
     WHILE (Len(@Text) > 0) 
     BEGIN 
      -- Getting the index of first delimiter 
      SET @Index = Charindex(@Delimiter, @Text) 

      -- Checking if there is no delimiter in Text 
      IF (@Index = 0) 
       AND (Len(@Text) > 0) 
       BEGIN 
        -- Inserting text which separated by delimiter  
        INSERT INTO @Strings 
         VALUES (Rtrim(Ltrim(@Text))) 

        BREAK 
       END 

      -- Checking if index found in Text then run the following script 
      IF (@Index > 1) 
       BEGIN 
        -- Inserting text after separated by delimiter  
        INSERT INTO @Strings 
         VALUES (LEFT(@Text, @Index - 1)) 

        -- Separate the inserted value from text 
        SET @Text = Rtrim(Ltrim(RIGHT(@Text, (Len(@Text) - @Index))) 
          ) 
       END 
      ELSE 
       -- Separate the inserted value from text 
       SET @Text = Rtrim(Ltrim(RIGHT(@Text, (Len(@Text) - @Index)))) 
     END 

     RETURN 
    END