Can I loop through a table variable in T-SQL?

后端 未结 11 649
轮回少年
轮回少年 2020-12-04 07:47

Is there anyway to loop through a table variable in T-SQL?

DECLARE @table1 TABLE ( col1 int )  
INSERT into @table1 SELECT col1 FROM table2

11条回答
  •  余生分开走
    2020-12-04 08:00

    Following Stored Procedure loop through the Table Variable and Prints it in Ascending ORDER. This example is using WHILE LOOP.

    CREATE PROCEDURE PrintSequenceSeries 
        -- Add the parameters for the stored procedure here
        @ComaSeperatedSequenceSeries nVarchar(MAX)  
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
    
        DECLARE @SERIES_COUNT AS INTEGER
        SELECT @SERIES_COUNT = COUNT(*) FROM PARSE_COMMA_DELIMITED_INTEGER(@ComaSeperatedSequenceSeries, ',')  --- ORDER BY ITEM DESC
    
        DECLARE @CURR_COUNT AS INTEGER
        SET @CURR_COUNT = 1
    
        DECLARE @SQL AS NVARCHAR(MAX)
    
        WHILE @CURR_COUNT <= @SERIES_COUNT
        BEGIN
            SET @SQL = 'SELECT TOP 1 T.* FROM ' + 
                '(SELECT TOP ' + CONVERT(VARCHAR(20), @CURR_COUNT) + ' * FROM PARSE_COMMA_DELIMITED_INTEGER( ''' + @ComaSeperatedSequenceSeries + ''' , '','') ORDER BY ITEM ASC) AS T ' +
                'ORDER BY T.ITEM DESC '
            PRINT @SQL 
            EXEC SP_EXECUTESQL @SQL 
            SET @CURR_COUNT = @CURR_COUNT + 1
        END;
    

    Following Statement Executes the Stored Procedure:

    EXEC  PrintSequenceSeries '11,2,33,14,5,60,17,98,9,10'
    

    The result displayed in SQL Query window is shown below:

    The function PARSE_COMMA_DELIMITED_INTEGER() that returns TABLE variable is as shown below :

    CREATE FUNCTION [dbo].[parse_comma_delimited_integer]
            (
                @LIST       VARCHAR(8000), 
                @DELIMITER  VARCHAR(10) = ',
                '
            )
    
            -- TABLE VARIABLE THAT WILL CONTAIN VALUES
            RETURNS @TABLEVALUES TABLE 
            (
                ITEM INT
            )
            AS
            BEGIN 
                DECLARE @ITEM VARCHAR(255)
    
                /* LOOP OVER THE COMMADELIMITED LIST */
                WHILE (DATALENGTH(@LIST) > 0)
                    BEGIN 
                        IF CHARINDEX(@DELIMITER,@LIST) > 0
                            BEGIN
                                SELECT @ITEM = SUBSTRING(@LIST,1,(CHARINDEX(@DELIMITER, @LIST)-1))
                                SELECT @LIST =  SUBSTRING(@LIST,(CHARINDEX(@DELIMITER, @LIST) +
                                DATALENGTH(@DELIMITER)),DATALENGTH(@LIST))
                            END
                        ELSE
                            BEGIN
                                SELECT @ITEM = @LIST
                                SELECT @LIST = NULL
                            END
    
                        -- INSERT EACH ITEM INTO TEMP TABLE
                        INSERT @TABLEVALUES 
                        (
                            ITEM
                        )
                        SELECT ITEM = CONVERT(INT, @ITEM) 
                    END
            RETURN
            END
    

提交回复
热议问题