Используйте CTE для создания подмножества данных - PullRequest
0 голосов
/ 19 октября 2018

Я хочу создать подмножество данных для целей тестирования, где я начну с таблицы Users, выберите X типа a, Y типа b, Z типа c (и т. Д.) И создайте новыйтаблица, содержащая этих пользователей.Затем мне нужно создать все связанные таблицы (с необходимыми записями), а затем все связанные таблицы с этими ...

Я вполне уверен, что лучший способ сделать это - это рекурсивное общее табличное выражение,однако у меня нет особого опыта с ними, и я надеялся, что кто-нибудь может мне помочь.Пока что у меня есть следующее, но я заметил две вещи:

  1. Уровень 2, кажется, содержит все, что было на уровне 1, в дополнение к новым записям, которые я ожидал бы
  2. Это на самом деле еще не создает / вставляет записи (мне все еще нужна помощь с этим)

    WITH cte AS
    (
        SELECT DISTINCT fk.object_id, fk.schema_id, fk.parent_object_id, fc.parent_column_id, t.schema_id AS referenced_schema_id, fk.referenced_object_id, ic.column_id AS referenced_column_id, 1 AS Level
        FROM sys.foreign_keys fk
            INNER JOIN sys.tables t ON fk.referenced_object_id = t.object_id
            INNER JOIN sys.foreign_key_columns fc ON fk.object_id = fc.constraint_object_id
            INNER JOIN sys.indexes i ON fk.referenced_object_id = i.object_id AND i.is_primary_key = 1
            INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
        WHERE fk.type = 'F' 
            AND fk.referenced_object_id = OBJECT_ID(N'dbo.Users', N'U')
    
        UNION ALL
    
        SELECT fk.object_id, fk.schema_id, fk.parent_object_id, fc.parent_column_id, t.schema_id, fk.referenced_object_id, ic.column_id AS referenced_column_id, cte.Level + 1
        FROM sys.foreign_keys fk     
            INNER JOIN sys.tables t ON fk.referenced_object_id = t.object_id
            INNER JOIN sys.foreign_key_columns fc ON fk.object_id = fc.constraint_object_id
            INNER JOIN sys.indexes i ON fk.referenced_object_id = i.object_id AND i.is_primary_key = 1
            INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
            INNER JOIN cte ON fk.referenced_object_id = cte.parent_object_id
        WHERE fk.type = 'F' 
            AND fk.parent_object_id <> cte.referenced_object_id
    ),
    cteHierarchy AS (
        SELECT DISTINCT
            OBJECT_NAME(cte.object_id) AS ReferringKey,
            SCHEMA_NAME(cte.schema_id) AS ReferringSchema,
            OBJECT_NAME(cte.parent_object_id) as ReferringTable,
            COL_NAME(cte.parent_object_id,cte.parent_column_id) ReferringColumn,
            SCHEMA_NAME(cte.referenced_schema_id) AS ReferencedSchema,
            OBJECT_NAME(cte.referenced_object_id) as ReferencedTable,
            COL_NAME(cte.referenced_object_id,cte.referenced_column_id) ReferencedColumn,
            Level
        FROM cte
    )
    SELECT *
    FROM cteHierarchy
    ORDER BY Level, ReferencedSchema, ReferencedTable, ReferringTable;
    

Спасибо за вашу помощь!

...