Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

डेटाबेस में सभी विदेशी कुंजियों के माध्यम से ट्रैवर्स करें और पथ उत्पन्न करें

ठीक है, सामान्य तौर पर क्योंकि आप सीटीई के पुनरावर्ती भाग में कुल कार्यों का उपयोग नहीं कर सकते हैं, आपको कॉलम कॉन्सटेनेशन भाग को दूसरे सीटीई में ले जाना चाहिए। आपके पास होगा:

    ;

WITH CTE_FKCols
AS (
    SELECT FK.NAME
        ,'[' + STUFF((
                SELECT ','
                    ,object_name(Col.object_id) + '.' + col.NAME
                FROM sys.foreign_key_columns C
                INNER JOIN sys.columns Col ON Col.object_id = c.referenced_object_id
                    AND col.column_id = c.referenced_column_id
                WHERE C.constraint_object_id = FK.object_id
                FOR XML PATH('')
                ), 1, 1, '') + ']' Cols
    FROM sys.foreign_keys FK
    )
    ,CTE
AS (
    SELECT fk.create_date
        ,fk.modify_date
        ,fkc.constraint_object_id AS ConstraintId
        ,OBJECT_NAME(fkc.constraint_object_id) AS ConstraintName
        --, fkc.referenced_object_id AS PrimaryKeyTableId
        ,OBJECT_NAME(fkc.referenced_object_id) AS PrimaryKeyTableName
        --, fkc.referenced_column_id AS PrimaryKeyColumnId
        ,OBJECT_NAME(fk.parent_object_id) AS ForeignKeyTableName
    FROM sys.foreign_key_columns fkc
    INNER JOIN sys.foreign_keys fk ON fk.OBJECT_ID = fkc.constraint_object_id
    )
    ,cte2 (
    create_date
    ,modify_date
    ,ConstraintName
    ,PrimaryKeyTableName
    ,ForeignKeyTableName
    ,Hops
    ,path
    )
AS (
    SELECT create_date
        ,modify_date
        ,ConstraintName
        ,PrimaryKeyTableName
        ,ForeignKeyTableName
        ,1
        ,CAST((
                SELECT F.Cols
                FROM CTE_FKCols F
                WHERE F.NAME = cte.ConstraintName
                ) AS NVARCHAR(4000))
    FROM cte

    UNION ALL

    SELECT cte.create_date
        ,cte.modify_date
        ,cte.ConstraintName
        ,cte.PrimaryKeyTableName
        ,cte.ForeignKeyTableName
        ,cte2.Hops + 1
        ,CAST((
                cte2.path + CAST('-> ' AS NVARCHAR(4000)) + (
                    SELECT F.Cols
                    FROM CTE_FKCols F
                    WHERE F.NAME = cte.ConstraintName
                    )
                ) AS NVARCHAR(4000))
    FROM cte2
    INNER JOIN cte ON cte2.ForeignKeyTableName = cte.PrimaryKeyTableName
        AND cte2.PrimaryKeyTableName != cte.PrimaryKeyTableName --Remove self-reference
    )
SELECT *
FROM cte2



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दो कॉलम डेटा के लिए सभी संभावित संयोजन

  2. यदि विदेशी कुंजी मौजूद नहीं है तो नाम का उपयोग किए बिना विदेशी कुंजी बाधा जोड़ें (या यदि मौजूद है तो विदेशी कुंजी बाधा छोड़ें)?

  3. SQL सर्वर में किसी अन्य संग्रहीत कार्यविधि में संग्रहीत कार्यविधि को कैसे निष्पादित करें?

  4. मान को अल्पविराम से अलग करने के लिए COALESCE फ़ंक्शन का उपयोग करना

  5. संदेश 102, स्तर 15, राज्य 1, पंक्ति 1 ' ' के निकट गलत वाक्य रचना