동적 SQL을 위해 SQL Server에서 SQL Server의 XML 경로에서 빈 출력을 어떻게 멈추는가?
-
14-11-2019 - |
문제
데이터 볼트에 대한 스크립트를 생성하려고했습니다. 아래는 많은 사람들이 많은 관계에 대한 테이블을 생성하는 동적 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?
제휴하지 않습니다 StackOverflow