2017-01-19 5 views
0

그냥 간단한 질문, 다음 쿼리를 단순화하는 방법 또한 루프 대신 .. 아무것도 바꿀 수 있습니까? 감사.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<[email protected] 
BEGIN 
    SET @REF= (SELECT DES FROM @TABLE WHERE [email protected]) 
    SET @TABLENAME=(SELECT TABLENAME FROM @TABLE WHERE [email protected]) 
    IF @REF='MASTER' 
    BEGIN 
     SET @SQL='SELECT * FROM '''[email protected]+''' A 
       INNER JOIN REPS C ON A.NAME=C.NAME' 
    END 
    IF @REF='SLAVE' 
    BEGIN 
     SET @SQL='SELECT * FROM '''[email protected]+''' A 
     INNER JOIN REPS C ON A.NAME=C.NAME' 
    END 
    SELECT @[email protected]+1 
END 

누구든지이 문제를 분류 할 수 있습니까?

+0

을 무슨 'IF의 사용 당신의 코드에서 '조건'. 두 조건 모두에있는 select 문은 동일하게 보입니다. 아래 코드를 참조하십시오. –

+0

도 쿼리가 출력을 생성하지 않으면 @sql 변수를 설정하지만 사용하지 마십시오. 그 동안 쿼리 문 목록을 생성 할 수도 있습니다. 테이블을 채우고 (많은 레코드를 한 번에 삽입 할 수 있으므로 UNION을 사용할 필요가 없음) 정기적 인 선택을하십시오. 그러나 우리는 당신이 ** @ SQL ** varible을 어떻게 소비하는지 모르므로 나는 단지 추측을 할 수 있습니다 – jean

답변

0

여기가 IF 조건 모두 내부 문

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<[email protected] 
BEGIN 

SET @TABLENAME=(SELECT TABLENAME FROM @TABLE WHERE [email protected]) 

SET @SQL='SELECT * FROM '''[email protected]+''' A 
     INNER JOIN REPS C ON A.NAME=C.NAME' 

    SELECT @[email protected]+1 
END 
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   

입니다 :

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 
관련 문제