SQL – Scorrere record della tabella

Ho creato una funzione definita dall’utente che converte una stringa delimitata da virgole in una tabella. Eseguire questa funzione in questo modo:

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

I risultati di questa query simile al seguente:

ID
--
1
2
3
4

In realtà, voglio scorrere ciascuna delle righe nella tabella. Tuttavia, non riesco a capire come fare. Qualcuno può farmi qualche esempio di SQL di come scorrere le righe della tabella?

  • Stai usando Oracle, SQL Server, MySQL, …? Cosa ti piacerebbe fare, mentre l’iterazione?
  • Potresti descrivere il problema che si sta cercando di risolvere? È abbastanza possibile che non c’è bisogno di scorrere per risolvere il tuo problema.
  • Sto usando SQL Server. Voglio scorrere la tabella.
  • google “cursore sql server free loop”: google.com/…
InformationsquelleAutor user255048 | 2010-02-05

 

4 Replies
  1. 14

    In SQL SERVER 2000/05/08 è possibile utilizzare un Cursore come mostrato di seguito.

    Tuttavia, prima di andare giù il cursore percorso si dovrebbe prima guardare i problemi connessi con i cursori in 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
    • Quando ho scorrere come questa, l’ultima riga della tabella viene sputato fuori due volte…
  2. 5

    Non utilizzare il cursore se si può evitare, di norma, tutti si ha realmente bisogno è quello di unirsi al tavolo che si è creato. Se il cursore è fare un update, insert o delete, è del 99,9% di probabilità di non aver bisogno di un cursore. I cursori dovrebbe essere una tecnica di ULTIMA istanza non è il primo resort. Scorrere i record è quasi sempre una cattiva scelta in un database. Imparare a pensare in set.

    Perché si dovrebbe evitare i cursori? Perchè lo crea prestazioni incubi. Ho cambiato di processi di assunzione di 24 o più ore per meno di un minuto, eliminando il curosr.

  3. 1

    Utilizzare il seguente funzione , che prende la corda e il delimitatore di simbolo….

    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 

Lascia un commento