0

我试图为数据保险库生成一个脚本,下面是动态 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 --HAS SOME PROBLEMS to @LOAD_DATE_RS。如果该部分返回空白输出(意味着没有带有额外主键的表),则整个输出为空白。我该如何阻止这个?如果那部分是空白的,那么我仍然需要构建另一个动态 SQL,以便我可以执行它来获取我想要的表。请帮忙

4

1 回答 1

1

“空白”是指空字符串还是Null?如果它为空,您可以IsNull()围绕连接的那部分进行包装。

如果您在没有 的情况下自行运行令人不安的部分,它For XML Path('')会返回所有预期值吗?

于 2011-05-18T00:29:24.993 回答