如何替换while循环?

时间:2017-02-07 07:27:01

标签: sql-server tsql

我试图简化以下sql查询,由于while循环需要更多时间。

DECLARE @TEMP TABLE
    (
        ID NUMERIC(18,0) IDENTITY  (1, 1) PRIMARY KEY NOT NULL, 
        NAME VARCHAR(1000),
        CATEGORY_ID INT,
        TYPE1 VARCHAR(100),
        VALUE VARCHAR(6000),
        TYPE2 VARCHAR(100)
    )

    INSERT INTO @TEMP 
    SELECT 
        NAME ,
        A.CATEGORY_ID,
        A.TYPE1,
        A.VALUE,
        A.TYPE2

     FROM 
        DBO.TABLE1 A,
        DBO.TABLE2 B
     WHERE  
        A.CATEGORY_ID=B.CATEGORY_ID 
     ORDER BY A.CATEGORY_ID

        DECLARE @ROWCNT INT=1 , @ROWS INT=0 , @NAME VARCHAR(100),@TYPE1 VARCHAR(100)
            ,@STAT CHAR(1)='Y'
            , @VALUE VARCHAR(6000)
            ,@COND VARCHAR(8000)
            , @TYPE2 VARCHAR(100)
            SELECT @COND='SELECT * FROM TABLE3 '
SELECT @ROWCNT = @ROWCNT , @ROWS = (@ROWCNT-1)+ COUNT(1) FROM @TEMP 
    WHILE @ROWCNT <= @ROWS 
        BEGIN       
            SELECT  @NAME   =   NAME ,
                @TYPE1      =   LTRIM(RTRIM(TYPE1)) ,
                @VALUE          =   VALUE,
                @TYPE2      =   ISNULL(TYPE2,'')
            FROM @TEMP WHERE ID = @ROWCNT

            IF @STAT='Y'
                BEGIN
                    IF @TYPE1 = 'SQL'
                        BEGIN
                            SELECT @COND=@COND + '  A'+'.'+(@NAME)+' '+@TYPE1+ ' ('''+@VALUE+''') '+@TYPE2+' '+CHAR(13)
                        END
                    ELSE
                        BEGIN
                            SELECT @COND=@COND + '  A'+'.'+(@NAME)+' '+@TYPE1+ ''''+@VALUE+''' '+@TYPE2+' '++CHAR(13)
                        END
                END
            SELECT @ROWCNT=@ROWCNT+1; 
        END
        PRINT (@COND)

重要的是替换while循环而不是CTE或其他东西。 任何人都可以解决这个问题。谢谢提前

1 个答案:

答案 0 :(得分:2)

看起来你需要类似下面的内容。

DECLARE @COND VARCHAR(8000) ='SELECT * FROM TABLE3 '
 + (SELECT '  A' + '.' + NAME + ' ' + LTRIM(RTRIM(TYPE1))
           + CASE
               WHEN LTRIM(RTRIM(TYPE1)) = 'SQL' THEN ' (''' + VALUE + ''') '
               ELSE VALUE
             END
           + ISNULL(TYPE2, '') + ' ' + CHAR(13)
    FROM   @TEMP
    ORDER  BY ID
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(8000)');

PRINT @COND 

生成的字符串不是有效的SQL