Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-遍历表记录_Sql_Sql Server - Fatal编程技术网

SQL-遍历表记录

SQL-遍历表记录,sql,sql-server,Sql,Sql Server,我创建了一个用户定义的函数,用于将逗号分隔的字符串转换为表。我这样执行此函数: select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4') 此查询的结果如下所示: ID -- 1 2 3 4 实际上,我希望遍历这个表中的每一行。然而,我不知道如何做到这一点。有人能给我演示一些如何遍历表中的行的示例SQL吗?答案是游标,但如果有机会不使用游标,我建议使用其他解决方案 您的查询看起来像SQL Server查询,因此下面是SQL

我创建了一个用户定义的函数,用于将逗号分隔的字符串转换为表。我这样执行此函数:

select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4')
此查询的结果如下所示:

ID
--
1
2
3
4

实际上,我希望遍历这个表中的每一行。然而,我不知道如何做到这一点。有人能给我演示一些如何遍历表中的行的示例SQL吗?

答案是游标,但如果有机会不使用游标,我建议使用其他解决方案

您的查询看起来像SQL Server查询,因此下面是SQL Server 2008的文档


在SQL SERVER 2000/05/08中,可以使用光标,如下所示

但是,在沿着游标路径前进之前,您应该首先研究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

如果可以避免使用游标,请不要使用它,通常真正需要的是连接到所创建的表。如果光标正在执行更新、插入或删除操作,则99.9%的几率不需要光标。游标应该是最后手段,而不是第一手段。在数据库中,遍历记录几乎总是一个糟糕的选择。学会成套思考


为什么要避免使用游标?因为他们制造了表演噩梦。通过移除curosr,我将流程从24小时或更长时间改为不到一分钟

使用下面的函数,该函数接受字符串和分隔符符号

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 

您使用的是Oracle、SQL Server、MySQL等吗。。。?迭代时您想做什么?您能描述一下您试图解决的问题吗?很可能您不需要迭代来解决问题。我使用的是SQL Server。我想遍历table.google“sql server无光标循环”:当我这样迭代时,表的最后一行会被吐出两次。。。