동적 SQL을 위해 SQL Server에서 SQL Server의 XML 경로에서 빈 출력을 어떻게 멈추는가?

StackOverflow https://stackoverflow.com/questions/6037910

문제

데이터 볼트에 대한 스크립트를 생성하려고했습니다. 아래는 많은 사람들이 많은 관계에 대한 테이블을 생성하는 동적 SQL입니다.

DECLARE @LOAD_DATE_RS VARCHAR(100)
SET @LOAD_DATE_RS = 'LOAD_DATETIME DATETIME NOT NULL,' + CHAR(10) 
                    + 'RECORD_SOURCE VARCHAR(100) NOT NULL,'+CHAR(10)
DECLARE @CREATE_LINK_M_N_RELN VARCHAR(MAX)                  
SET  @CREATE_LINK_M_N_RELN = (SELECT    
                                'CREATE TABLE LINK_'+ REPLACE(HL.TABLENAME, ' ', '_') + CHAR(10)
                                + '( '
                                    + ( SELECT  
                                            DISTINCT FPR.PK_TABLE + '_ID  INT NOT NULL,'+ CHAR(10)
                                        FROM    
                                            FK_PK_REF FPR
                                        WHERE   
                                            FK_Table IN (   SELECT 
                                                                HL2.TABLENAME 
                                                            FROM 
                                                                HUB_OR_LINK HL2 WHERE HL2.HUBORLINK= 'LINK'
                                                                AND HL2.TABLENAME = HL.TABLENAME)
                                        FOR XML PATH (''))
                            --GET PRIMARY KEYS --HAS SOME PROBLEMS
                            +(  SELECT  
                                    DISTINCT C.COLUMN_NAME 
                                    + ' '+ C.DATA_TYPE      
                                    +   CASE WHEN C.DATA_TYPE IN('CHAR','VARCHAR','NVARCHAR') THEN 
                                            '('+CAST(C.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(100))+')'
                                        ELSE 
                                            ' ' 
                                        END 
                                    +','+ CHAR(10)
                                FROM    
                                     INFORMATION_SCHEMA.COLUMNS C 

                                WHERE   
                                    C.TABLE_NAME = HL.TABLENAME
                                AND C.COLUMN_NAME IN (SELECT CCU2.COLUMN_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU2
                                                        INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON 
                                                        CCU2.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG
                                                        AND CCU2.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
                                                        AND CCU2.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                                                        WHERE TC.TABLE_NAME = HL.TABLENAME
                                                        AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY')
                                AND C.COLUMN_NAME NOT IN (SELECT 
                                                                C.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS C
                                                                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU3
                                                                ON C.TABLE_CATALOG = CCU3.TABLE_CATALOG
                                                                AND C.TABLE_SCHEMA = CCU3.TABLE_SCHEMA 
                                                                AND C.TABLE_NAME = CCU3.TABLE_NAME
                                                                AND C.COLUMN_NAME =CCU3.COLUMN_NAME

                                                                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON 
                                                                CCU3.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG
                                                                AND CCU3.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
                                                                AND CCU3.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                                                                AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                                                            WHERE   
                                                                C.TABLE_NAME 
                                                            IN (SELECT 
                                                                    HL4.TABLENAME FROM HUB_OR_LINK HL4 
                                                                WHERE 
                                                                    HL4.HUBORLINK = 'HUB'

                                                                ) --GET ALL HUBS
                                                            )


                                FOR XML PATH ('')
                            )
                            +  @LOAD_DATE_RS
                            + 'CONSTRAINT PK_LINK_' +REPLACE(HL.TABLENAME, ' ', '_') + '  PRIMARY KEY (' 
                            +(  SELECT  
                                    DISTINCT PK_TABLE+'_ID,'
                                FROM    
                                    FK_PK_REF
                                WHERE   
                                    FK_Table NOT IN (SELECT DISTINCT PK_Table FROM FK_PK_REF)
                                    AND FK_TABLE = HL.TABLENAME
                                FOR XML PATH('')
                             )

                            + '))'+CHAR(10)+CHAR(10)
                    FROM    HUB_OR_LINK HL INNER JOIN INFORMATION_SCHEMA.TABLES T 
                    ON
                            T.TABLE_NAME = HL.TABLENAME
                    WHERE   HL.HUBORLINK = 'LINK'
                    FOR XML PATH (''))

SELECT @CREATE_LINK_M_N_RELN = REPLACE(@CREATE_LINK_M_N_RELN,',))','))');
PRINT @CREATE_LINK_M_N_RELN
.

소스 테이블의 기본 키를 주석 - 가젯 기본 키의 정의에 추가하는 부분은 @load_date_rs에 몇 가지 문제가 발생합니다.해당 부분이 빈 출력을 반환하면 (추가 기본 키가있는 테이블이 없음) 전체 출력이 비어 있습니다.이것을 어떻게 멈추게합니까?해당 부분이 비어 있으면 여전히 다른 동적 SQL을 구축하여 내가 원하는 테이블을 가져 오도록 실행할 수 있습니다.를 도와주세요

도움이 되었습니까?

해결책

By "Blank" do you mean an empty string or Null? If it is null, You could wrap an IsNull() around that portion of the concatenation.

If you run the troubling section on it's own without For XML Path(''), does it return all of the expected values?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top