如何删除while循环?

时间:2017-01-19 05:53:55

标签: sql-server tsql sql-server-2012

只是一个简单的问题,如何简化以下查询,还可以替换任何东西而不是while循环..?感谢。

DECLARE @CNT INT=0
        ,@CNTER INT=1
        ,@REF VARCHAR(20)
        ,@TABLENAME VARCHAR(20)
        ,@SQL VARCHAR(MAX)
DECLARE @TABLE TABLE(ID INT,TABLENAME VARCHAR(20),DES VARCHAR(20))
INSERT @TABLE 
SELECT 1,'TB1','MASTER'
UNION 
SELECT 2,'TB2','MASTER'
UNION 
SELECT 3,'TB3','SLAVE'
UNION 
SELECT 4,'TB4','SLAVE'

SELECT @CNT =COUNT(*) FROM @TABLE

WHILE @CNTER<=@CNT
BEGIN
    SET @REF= (SELECT DES  FROM @TABLE WHERE ID=@CNTER)
    SET @TABLENAME=(SELECT TABLENAME FROM @TABLE WHERE ID=@CNTER)
    IF @REF='MASTER'
    BEGIN
        SET @SQL='SELECT * FROM '''+@TABLENAME+''' A
                INNER JOIN REPS C   ON A.NAME=C.NAME'
    END 
    IF @REF='SLAVE'
    BEGIN
        SET @SQL='SELECT * FROM '''+@TABLENAME+''' A
        INNER JOIN REPS C   ON A.NAME=C.NAME'
    END 
    SELECT @CNTER=@CNTER+1
END

有没有人来解决这个问题?

3 个答案:

答案 0 :(得分:0)

这是一种方式

SET @sql = (SELECT CASE
                     WHEN DES = 'master' THEN 'SELECT * FROM ''' +  QUOTENAME(@TABLENAME)
                                              + ''' A
                INNER JOIN REPS C   ON A.NAME=C.NAME;'
                     WHEN DES = 'SLAVE' THEN 'SELECT * FROM ''' + QUOTENAME(@TABLENAME)
                                             + ''' A
        INNER JOIN REPS C   ON A.NAME=C.NAME;'
                   END
            FROM   @TABLE
            FOR xml path (''),TYPE
        ).value('.', 'NVARCHAR(MAX)')

SELECT @sql        

值得一提的是IF条件内的语句是相同的

答案 1 :(得分:0)

DECLARE @CNT INT=0
        ,@CNTER INT=1
        ,@REF VARCHAR(20)
        ,@TABLENAME VARCHAR(20)
        ,@SQL VARCHAR(MAX)
DECLARE @TABLE TABLE(ID INT,TABLENAME VARCHAR(20),DES VARCHAR(20))
INSERT @TABLE 
SELECT 1,'TB1','MASTER'
UNION 
SELECT 2,'TB2','MASTER'
UNION 
SELECT 3,'TB3','SLAVE'
UNION 
SELECT 4,'TB4','SLAVE'

SELECT @CNT =COUNT(*) FROM @TABLE

WHILE @CNTER<=@CNT
BEGIN

 SET @TABLENAME=(SELECT TABLENAME FROM @TABLE WHERE ID=@CNTER)

 SET @SQL='SELECT * FROM '''+@TABLENAME+''' A
        INNER JOIN REPS C   ON A.NAME=C.NAME'

    SELECT @CNTER=@CNTER+1
END

答案 2 :(得分:0)

试试这个:

    DECLARE @CNT INT=0
            ,@CNTER INT=1
            ,@REF VARCHAR(20)
            ,@TABLENAME VARCHAR(20)
            ,@SQL VARCHAR(MAX)

    DECLARE @TABLE TABLE(ID INT,TABLENAME VARCHAR(20),DES VARCHAR(20))
    INSERT @TABLE 
    SELECT 1,'TB1','MASTER'
    UNION 
    SELECT 2,'TB2','MASTER'
    UNION 
    SELECT 3,'TB3','SLAVE'
    UNION 
    SELECT 4,'TB4','SLAVE'


    SET @SQL = (SELECT 'SELECT * FROM ' + QUOTENAME(TABLENAME) + ' A INNER JOIN REPS C ON A.NAME = C.NAME; ' FROM @TABLE FOR XML PATH(''))

    SELECT @SQL