Search code examples
sql-servervariablescursorsubquery

Cursor inside cursor error in SQL Server


I have a SQL command:

CREATE TABLE #TEMP_TABLE
    ( BUSINESS_DATE DATE
    , COLUMN_NAME VARCHAR(100)
    , ROW_COUNT INT
    , TEST_TIME DATETIME)
DECLARE @COLUMN VARCHAR(MAX)
DECLARE @TABLE_NAME TABLE 
( 
    TABLE_NAME VARCHAR(MAX) 
)
INSERT INTO @TABLE_NAME
SELECT * FROM DATA.DBO.[SOURCE_TABLE]
DECLARE @DATE VARCHAR(8) = '20160429'

DECLARE CURSOR_TB CURSOR FOR
    SELECT TABLE_NAME FROM @TABLE_NAME
OPEN CURSOR_TB
FETCH NEXT FROM CURSOR_TB INTO @TABLE_NAME
WHILE @@FETCH_STATUS = 0
BEGIN  
DECLARE CURSOR_CL CURSOR FOR
        SELECT DISTINCT COLUMN_NAME
        FROM DATA.INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM @TABLE_NAME )
        ORDER BY COLUMN_NAME
    OPEN CURSOR_CL
    FETCH NEXT FROM CURSOR_CL INTO @COLUMN
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC('
            INSERT INTO #TEMP_TABLE

            SELECT BUSINESS_DATE
                , '''+@COLUMN+''' 
                , COUNT('+@COLUMN+') AS ['+@COLUMN+']
                , SYSDATETIME ()
            FROM DATA.DBO.'+@TABLE_NAME+'
            WHERE BUSINESS_DATE = '''+@DATE+'''
                AND '+@COLUMN+' IS NOT NULL
            GROUP BY BUSINESS_DATE
        ')
        FETCH NEXT FROM CURSOR_CL INTO @COLUMN
    END
    CLOSE CURSOR_CL
    DEALLOCATE CURSOR_CL
    FETCH NEXT FROM CURSOR_TB INTO @TABLE_NAME
END
CLOSE CURSOR_TB
DEALLOCATE CURSOR_TB

SELECT * FROM #TEMP_TABLE

After running this code, I met the error :

Msg 137, Level 16, State 1, Line 19 Must declare the scalar variable "@TABLE_NAME". Msg 137, Level 16, State 1, Line 38 Must declare the scalar variable "@TABLE_NAME". Msg 137, Level 16, State 1, Line 47 Must declare the scalar variable "@TABLE_NAME".

Can you help me fix it?


Solution

  • You should use [@TABLE_NAME] instead.

    Here is the documentation.