在查询中选择特定表?

时间:2017-01-26 08:31:57

标签: sql dictionary sql-server-2014

我发现这个查询用于构建一个字典并且它运行良好,但是我想只使用几个特定的​​表,但我无法弄清楚在哪里放置'WHERE'或类似的东西。我已经阅读了查询,但就像我说的那样,我无法弄明白(我刚刚开始使用SQL)。

有什么想法吗?

SELECT
d.[primary key],
d.[foreign key],
CASE
    WHEN LEN(d.[column]) = 0 THEN d.[table]
    ELSE ''
END AS [table],
d.[column],
CAST(d.[description] AS VARCHAR(MAX)) AS [description]/*,
d.[data type],
d.nullable,
d.[identity],
d.[default]*/
FROM
(
    SELECT
        '' AS [primary key],
        '' AS [foreign key],
        s.[name] AS [schema],
        CASE
            WHEN s.[name] = 'dbo' THEN t.[name]
            ELSE s.[name] + '.' + t.[name]
        END AS [table],
        '' AS [column],
        ISNULL(RTRIM(CAST(ep.[value] AS NVARCHAR(4000))), '') AS [description],
        '' AS [data type],
        '' AS nullable,
        '' AS [identity],
        '' AS [default],
        NULL AS column_id
    FROM
        sys.tables t 

            INNER JOIN sys.schemas s ON
                s.[schema_id] = t.[schema_id]

            -- get description of table, if available
            LEFT OUTER JOIN sys.extended_properties ep ON
                ep.major_id = t.[object_id] AND
                ep.minor_id = 0 AND
                ep.name = 'MS_Description' AND
                ep.class = 1
    WHERE
        t.is_ms_shipped = 0 AND
        NOT EXISTS
        (
            SELECT *
            FROM
                sys.extended_properties ms
            WHERE
                ms.major_id = t.[object_id] AND
                ms.minor_id = 0 AND
                ms.class = 1 AND
                ms.[name] = 'microsoft_database_tools_support'
        )

    UNION ALL

    SELECT
        CASE
            WHEN pk.column_id IS NOT NULL THEN 'PK'
            ELSE ''
        END AS [primary key],
        CASE
            WHEN fk.primary_table IS NOT NULL
                THEN fk.primary_table + '.' + fk.primary_column
            ELSE ''
        END AS [foreign key],
        s.[name] AS [schema],
        CASE
            WHEN s.[name] = 'dbo' THEN t.[name]
            ELSE s.[name] + '.' + t.[name]
        END AS [table],
        c.[name] AS [column],
        ISNULL(RTRIM(CAST(ep.[value] AS NVARCHAR(4000))), '') AS [description],
        CASE
            WHEN uty.[name] IS NOT NULL THEN uty.[name]
            ELSE ''
        END +
            CASE
                WHEN uty.[name] IS NOT NULL AND sty.[name] IS NOT NULL THEN '('
                ELSE ''
            END +
            CASE
                WHEN sty.[name] IS NOT NULL THEN sty.[name]
                ELSE ''
            END +
            CASE
                WHEN sty.[name] IN ('char', 'nchar', 'varchar', 'nvarchar', 'binary', 'varbinary')
                    THEN '(' + 
                        CASE
                            WHEN c.max_length = -1 THEN 'max'
                            ELSE 
                                CASE
                                    WHEN sty.[name] IN ('nchar', 'nvarchar')
                                        THEN CAST(c.max_length / 2 AS VARCHAR(MAX))
                                    ELSE
                                        CAST(c.max_length AS VARCHAR(MAX))
                                END
                        END
                         + ')'
                WHEN sty.[name] IN ('numeric', 'decimal')
                    THEN '(' + 
                        CAST(c.precision AS VARCHAR(MAX)) + ', ' + CAST(c.scale AS VARCHAR(MAX))
                         + ')'
                ELSE
                    ''
            END +
            CASE
                WHEN uty.[name] IS NOT NULL AND sty.[name] IS NOT NULL THEN ')'
                ELSE ''
            END AS [data type],
        CASE
            WHEN c.is_nullable = 1 THEN 'Y'
            ELSE ''
        END AS nullable,
        CASE
            WHEN c.is_identity = 1 THEN 'Y'
            ELSE ''
        END AS [identity],
        ISNULL(dc.[definition], '') AS [default],
        c.column_id
    FROM
        sys.columns c
            INNER JOIN sys.tables t ON
                t.[object_id] = c.[object_id]

            INNER JOIN sys.schemas s ON
                s.[schema_id] = t.[schema_id]

            -- get name of user data type
            LEFT OUTER JOIN sys.types uty ON
                uty.system_type_id = c.system_type_id AND
                uty.user_type_id = c.user_type_id AND
                c.user_type_id <> c.system_type_id

            -- get name of system data type
            LEFT OUTER JOIN sys.types sty ON
                sty.system_type_id = c.system_type_id AND
                sty.user_type_id = c.system_type_id

            -- get description of column, if available
            LEFT OUTER JOIN sys.extended_properties ep ON
                ep.major_id = t.[object_id] AND
                ep.minor_id = c.column_id AND
                ep.[name] = 'MS_Description' AND
                ep.[class] = 1

            -- get default's code text
            LEFT OUTER JOIN sys.default_constraints dc ON
                dc.parent_object_id = t.[object_id] AND
                dc.parent_column_id = c.column_id

            -- check for inclusion in primary key
            LEFT OUTER JOIN
            (
                SELECT
                    ic.column_id,
                    i.[object_id]
                FROM
                    sys.indexes i
                        INNER JOIN sys.index_columns ic ON
                            ic.index_id = i.index_id AND
                            ic.[object_id] = i.[object_id]
                WHERE
                    i.is_primary_key = 1
            ) pk ON
                pk.column_id = c.column_id AND
                pk.[object_id] = t.[object_id]

            -- check for inclusion in foreign key
            LEFT OUTER JOIN
            (
                SELECT
                    CASE
                        WHEN s.[name] = 'dbo' THEN pk.[name]
                        ELSE s.[name] + '.' + pk.[name]
                    END AS primary_table,
                    pkc.[name] as primary_column,
                    fkc.parent_object_id,
                    fkc.parent_column_id
                FROM
                    sys.foreign_keys fk
                        INNER JOIN sys.tables pk ON
                            fk.referenced_object_id = pk.[object_id]
                        INNER JOIN sys.schemas s ON
                            s.[schema_id] = pk.[schema_id]
                        INNER JOIN sys.foreign_key_columns fkc ON
                            fkc.constraint_object_id = fk.[object_id] AND
                            fkc.referenced_object_id = pk.[object_id]
                        INNER JOIN sys.columns pkc ON
                            pkc.[object_id] = pk.[object_id] AND
                            pkc.column_id = fkc.referenced_column_id
            ) fk ON
                fk.parent_object_id = t.[object_id] AND
                fk.parent_column_id = c.column_id
    WHERE
        t.is_ms_shipped = 0 AND
        NOT EXISTS
        (
            SELECT *
            FROM
                sys.extended_properties ms
            WHERE
                ms.major_id = t.[object_id] AND
                ms.minor_id = 0 AND
                ms.class = 1 AND
                ms.[name] = 'microsoft_database_tools_support'
        )
) d
ORDER BY
d.[schema],
d.[table],
d.column_id;

1 个答案:

答案 0 :(得分:0)

您只需要t.is_ms_shipped = 0的表格。只需在那里添加表名的标准。

WHERE t.is_ms_shipped = 0 AND t.[name] IN ('TABLE1', 'TABLE2') AND ...