2010-02-05 55 views
11

He creado una función definida por el usuario que convierte una cadena delimitada por comas en una tabla. Me ejecutar esta función, así:SQL - Iteración a través de registros de tabla

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

Los resultados de esta consulta se parecen a lo siguiente:

ID 
-- 
1 
2 
3 
4 

En realidad, quiero recorrer cada una de las filas de esta tabla. Sin embargo, no puedo entender cómo hacer esto. ¿Puede alguien mostrarme un ejemplo de SQL de cómo iterar a través de las filas de la tabla?

+2

¿Está utilizando Oracle, SQL Server, MySQL, ...? ¿Qué te gustaría hacer mientras iteras? – Andomar

+1

¿Podría describir el problema que está tratando de resolver? Es muy posible que no necesite iterar para resolver su problema. –

+1

Estoy usando SQL Server. Quiero iterar a través de la mesa. – user255048

Respuesta

10

En SQL SERVER 8.5.2000 se puede utilizar un cursor como se muestra a continuación.

Sin embargo, antes de ir por la ruta del cursor, primero debe examinar los problemas asociados con los cursores en 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 
0

La respuesta serían los cursores, pero si hay alguna posibilidad de no utilizar el cursor, sugeriría usar la otra solución.

Su consulta se ve como un servidor de consultas SQL, así que aquí está la documentación para SQL Server 2008.

http://msdn.microsoft.com/en-us/library/ms190028.aspx

4

No utilice el cursor si puede evitarlo, normalmente todo lo que realmente necesita es unirse a la tabla que ha creado. Si el cursor está realizando una actualización, inserción o eliminación, tiene un 99.9% de posibilidades de no necesitar un cursor. Los cursores deberían ser una técnica del ÚLTIMO recurso, no el primer recurso. Iterar a través de registros casi siempre es una opción pobre en una base de datos. Aprende a pensar en sets.

¿Por qué deberías evitar los cursores? Porque crean pesadillas de rendimiento. Cambié los procesos de tomar 24 horas o más a menos de un minuto eliminando el curosr.

1

utilizar la función de abajo, que toma la cadena y el símbolo delimitador ....

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 
Cuestiones relacionadas