Я пытался сгенерировать сценарий для хранилища данных, ниже приведен динамический 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
Часть, которая добавляет первичные ключи исходной таблицы к определению из комментария --GET PRIMARY KEYS - ИМЕЕТ НЕКОТОРЫЕ ПРОБЛЕМЫ к @LOAD_DATE_RS. Если эта часть возвращает пустой вывод (то есть нет таблиц с дополнительными первичными ключами), тогда весь вывод будет пустым. Как мне это остановить? Если эта часть пуста, то все же мне нужно собрать другой динамический SQL, чтобы я мог выполнить его, чтобы получить нужные мне таблицы. Пожалуйста, помогите