¿Cómo dejo de la salida en blanco de la ruta XML en SQL Server para SQL dinámico?
-
14-11-2019 - |
Pregunta
Estaba tratando de generar un script para la bóveda de datos, a continuación se encuentra el SQL dinámico que generará tablas para muchas de muchas relaciones:
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
La parte que está agregando las teclas primarias de la tabla de origen a la definición de la commina - Teclas principales de PRINCIPALES, y algunos problemas a @load_date_rs.Si esa pieza devuelve una salida en blanco (lo que significa que no hay tablas con teclas primarias adicionales), toda la salida está en blanco.¿Cómo paro esto?Si esa parte está en blanco, aún así, necesito obtener la otra SQL dinámica que se construyó para poder ejecutarlo para obtener las tablas que quiero.Por favor ayuda
Solución
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?