Iterate through a list of strings In SQL Server?

前端 未结 1 1457
情深已故
情深已故 2020-12-30 10:43

How do you access the value within a list in T-SQL?

I have a SQL statement that loops through and counts how many times a value appears in a specific column in

相关标签:
1条回答
  • 2020-12-30 11:27

    What you created is not a list but a table variable. So how to Iterate over a table. Below is a simple example and I think you can proceed after if you understand it:

    (Note: Cursors are not efficient when it comes to performance and large tables)

    DECLARE @MyList TABLE (Value NVARCHAR(50))
    INSERT INTO @MyList VALUES ('Data1')
    INSERT INTO @MyList VALUES ('Data2')
    INSERT INTO @MyList VALUES ('Data3')
    INSERT INTO @MyList VALUES ('Data4')
    INSERT INTO @MyList VALUES ('Data5')
    INSERT INTO @MyList VALUES ('Data6')
    INSERT INTO @MyList VALUES ('Data7')
    INSERT INTO @MyList VALUES ('Data8')
    
    DECLARE @value VARCHAR(50)
    
    DECLARE db_cursor CURSOR FOR  
    SELECT Value FROM @MyList
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @value   
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
           PRINT @value
    
           -- PUT YOUR LOGIC HERE
           -- MAKE USE OR VARIABLE @value wich is Data1, Data2, etc...
    
           FETCH NEXT FROM db_cursor INTO @value   
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor
    

    Prints:

    Data1
    Data2
    Data3
    Data4
    Data5
    Data6
    Data7
    Data8
    

    So you have inside @value variable Data, Data2 .. etc . I think this solves your problem.

    Alternative way is using a WHILE loop + OFFSET + FETCH NEXT :

    DECLARE @MyList TABLE (Value NVARCHAR(50))
    INSERT INTO @MyList VALUES ('Data1')
    INSERT INTO @MyList VALUES ('Data2')
    INSERT INTO @MyList VALUES ('Data3')
    INSERT INTO @MyList VALUES ('Data4')
    INSERT INTO @MyList VALUES ('Data5')
    INSERT INTO @MyList VALUES ('Data6')
    INSERT INTO @MyList VALUES ('Data7')
    INSERT INTO @MyList VALUES ('Data8')
    
    DECLARE @COUNTER INT = 0;
    DECLARE @MAX INT = (SELECT COUNT(*) FROM @MyList)
    DECLARE @VALUE VARCHAR(50);
    
    WHILE @COUNTER < @MAX
    BEGIN
    
    SET @VALUE = (SELECT VALUE FROM
          (SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) [index] , Value from @MyList) R 
           ORDER BY R.[index] OFFSET @COUNTER 
           ROWS FETCH NEXT 1 ROWS ONLY);
    
    PRINT @VALUE
    
    SET @COUNTER = @COUNTER + 1
    
    END
    

    You get the same result

    0 讨论(0)
提交回复
热议问题