-1
votes

Requête pour renvoyer la base de données, le schéma, la table, la colonne pour toutes les bases de données

EDIT : J'ai édité mon message original pour ajouter un peu de clarté.

1) Est-il possible d'écrire une requête qui retournera une base de données, un schéma, une table, une colonne et un type de colonne, pour toutes les bases de données sur le serveur? En particulier, est-il possible de joindre sys.databases avec d'autres vues de catalogue système, telles que sys.tables? Je n'ai pas été en mesure d'identifier une relation PK / FK entre sys.databases et sys.schema, sys.tables ou d'autres vues de catalogue système.

2) Sinon, est-il possible d'écrire une requête qui renverra ce qui précède, où je fournisse le nom de la base de données comme paramètre, par exemple en utilisant DB_ID ('my_database') comme filtre pour cette requête? Si possible, je préférerais ne pas utiliser de SQL dynamique?

3) Sinon, si je dois utiliser du SQL dynamique, puis-je charger les résultats de ce SQL dynamique dans un curseur?

Contexte: j'écris une procédure stockée qui génère du code pour une vue. Pour chaque colonne de caractères de la table source (paramètre du SP), je dois appeler une fonction qui supprime les caractères inutiles. Je souhaite créer ce SP dans une base de données utilitaire et prendre en charge la création de vues sur plusieurs autres bases de données.


3 commentaires

Veuillez faire quelques efforts. Google this - sqlserver get database, schema, table, column, column type for all databases


SO n'est pas un service d'écriture de code gratuit. Et oui, on attend de vous que vous fassiez un effort pour écrire du code, pas seulement pour rechercher. En outre, il est préférable de se concentrer sur un seul problème dans une question - pas sur trois. Vous devrez résoudre de nombreux problèmes qui nécessitent une connaissance approfondie des composants internes du serveur SQL. Il vaut peut-être mieux prendre du recul et se concentrer d'abord sur l'objectif.


Et les réponses courtes sont - non, oui et oui (peut-être - mais votre terminologie prête à confusion).


6 Réponses :


2
votes
  1. Pour toutes les bases de données: sélectionnez * dans sys.databases
  2. Pour toutes les tables: Sélectionnez * dans INFORMATION_SCHEMA.TABLES Où TABLE_TYPE = 'BASE TABLE'
  3. À partir de toutes les vues Sélectionnez * dans INFORMATION_SCHEMA.TABLES Où TABLE_TYPE = 'VIEW'
  4. Pour toutes les colonnes: Sélectionnez * dans INFORMATION_SCHEMA.COLUMNS, veuillez utiliser nom_table comme filtre.
  5. Dans la table INFORMATION_SCHEMA.COLUMNS, vous obtiendrez le DATA_TYPE pour le type de colonne

Commencez par charger les bases de données à partir de la base de données du serveur SQL, puis obtenez les noms de base de données et connectez-vous à cette base de données, puis utilisez toutes les requêtes ci-dessus pour obtenir ce dont vous avez besoin.


2 commentaires

Merci. Je connais les vues INFORMATION_SCHEMA. Je recherche une requête qui renverra DatabaseName, SchemaName, TableName, ColumnName, ColumnType pour l'ensemble du serveur, c'est-à-dire toutes les bases de données, tables, etc. Alternativement, une requête où je spécifie une base de données, comme SELECT * FROM WHATEVER JOIN BLAH WHERE db_id = DB_ID ('maître'). J'ai examiné les sys sélectionnés. vues, mais je ne vois pas comment les associer et je n'ai pas obtenu de résultats Google pertinents lors de mes recherches.


Pour SchemaName, TableName, ColumnName, ColumnType peut être trouvé dans Select * from INFORMATION_SCHEMA.COLUMNS as ColumnNames ici. Pour obtenir les noms de bases de données, vous pouvez utiliser select * from sys.databases. Lorsque l'utilisateur sélectionne la base de données, vous pouvez modifier votre chaîne de connexion et obtenir les informations de la colonne.



1
votes

J'ai créé une procédure stockée qui peut renvoyer les informations de colonne si vous transmettez le nom de la base de données.

Create PROCEDURE SP_GetColumnInfo   
    @DatabaseName varchar(max)
AS
BEGIN   
    SET NOCOUNT ON;
    EXEC('USE ' + @DatabaseName + '; Select DatabaseName = '''+ @DatabaseName +''', Table_Schema, Table_Name, Column_Name, Data_Type from INFORMATION_SCHEMA.COLUMNS as ColumnNames');     
END
GO


0 commentaires

1
votes

Ceci est une réponse à votre troisième question et l'approche suivante génère une instruction T-SQL dynamique, qui renvoie le résultat attendu. Vous pouvez essayer de l'exécuter directement ou créer un curseur.

-- Declarations
DECLARE @stm nvarchar(max)
SET @stm = N''

-- Dynamic SQL
SELECT @stm = (
   SELECT CONCAT(
        N'UNION ALL ',
        N'SELECT N''',
        name,
        N''' AS DATABASE_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE '+
        N'FROM ', 
        QUOTENAME([name]), 
        N'.INFORMATION_SCHEMA.COLUMNS '
    )
   FROM sys.databases
   WHERE [name] NOT IN ('master', 'model', 'msdb', 'tempdb')
   FOR XML PATH('')
)
SET @stm = STUFF(@stm, 1, 10, N'')
PRINT @stm

-- Execution without cursor
EXEC sp_executesql @stm

-- Execution with cursor
SET @stm = CONCAT(
    N'DECLARE info CURSOR FORWARD_ONLY READ_ONLY FOR ', 
    @stm
)
EXEC sp_executesql @stm
OPEN info
-- Fetch operations
CLOSE info
DEALLOCATE info


0 commentaires

0
votes

La question posée ne fait aucune référence à des efforts antérieurs, aucun échantillon SQL qui n'a pas fonctionné. Ce qui manque, c'est le partage de cet effort, ou la description du problème ou des messages d'erreur reçus.

Jetez un œil au sixième (ou à peu près) article renvoyé par Google

  sqlserver get database, schema, table, column, column type for all databases 

https://www.red-gate.com/simple-talk/sql/database-administration/exploring-your-sql-server-databases-with-t-sql/

Regardez la section sp_msforeachtable où ils citent la fonction EXEC sp_MSforeachdb '...'

et la section Explorer votre modèle de données en profondeur, avec le listing 23: Explorer les colonnes et leurs types de données.

Adaptez ces ressources à votre question.


1 commentaires

J'ai vu ce lien avant de poster sur SO. EXEC sp_MSforeachdb ne répond pas à mes besoins.



0
votes

Sur la base des commentaires et des réponses fournis, ainsi que de mes propres recherches supplémentaires:

1) Non, il n'est pas possible de joindre sys.databases à d'autres vues de catalogue système, du moins celles dont j'ai besoin (sys.schema, sys.tables, sys.columns). De plus, d'après mes recherches, les vues du catalogue système sont spécifiques à la base de données (pour les vues ci-dessus). IOW, sys.tables répertorie les tables de sa base de données, sys.columns répertorie les colonnes de sa base de données, etc. Cela inclut la base de données master.

2) Bien que @SMor ait déclaré que c'était possible, je n'ai pas découvert de moyen de transmettre le nom de la base de données en tant que paramètre, sans utiliser de SQL dynamique. Par exemple, cela ne fonctionne pas:

CREATE PROCEDURE [dbo].[spGenerateCleanViews2]
    @srcTableName SYSNAME  -- Must be a 3-level table name, case-insensitive
   ,@tgtTableName SYSNAME = 'cln.vw{srcTable}'
   ,@debug BIT = 1
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Declare variables
    DECLARE @srcDatabase SYSNAME
           ,@srcSchema SYSNAME
           ,@srcTable SYSNAME
           ,@tgtDatabase SYSNAME
           ,@tgtSchema SYSNAME
           ,@tgtTable SYSNAME
    ;

    DECLARE @columnName SYSNAME
           ,@columnType SYSNAME
           ,@sql NVARCHAR(MAX) = ''
           ,@DBExec NVARCHAR(100)
           ,@line NVARCHAR(256)
           ,@n INT
           ,@pattern VARCHAR(100) = '%[^ -~]%'  -- Low order ASCII print characters CHAR(32) - CHAR(126)
    ;

    -- Parse source table
    SET @srcTable = PARSENAME(@srcTableName,1);
    SET @srcSchema = PARSENAME(@srcTableName,2);
    SET @srcDatabase = PARSENAME(@srcTableName,3);

    -- Don't try to set defaults - if it's not a three level name then abort
    IF @srcTable IS NULL
        OR @srcSchema IS NULL
        OR @srcDatabase IS NULL
    BEGIN
        RAISERROR ('A three-level table name (server.schema.table) is required.',16,1);
        RETURN;
    END

    -- Parse target table
    SET @tgtTable = PARSENAME(@tgtTableName,1);
    SET @tgtSchema = PARSENAME(@tgtTableName,2);
    SET @tgtDatabase = PARSENAME(@tgtTableName,3);

    -- Set defaults if NULL
    IF @tgtDatabase IS NULL
        SET @tgtDatabase = DB_NAME()

    IF @tgtSchema IS NULL
        SET @tgtSchema = 'cln'

    IF @tgtTable IS NULL
        SET @tgtTable = 'vw{srcTable}'

    -- Replace tokens in the target table name
    SET @tgtTable = REPLACE(@tgtTable,'{srcTable}',@srcTable);

    -- Create scrollable cursor
    BEGIN TRY
        DECLARE cursorColumns SCROLL CURSOR FOR SELECT COLUMN_NAME
                                                      ,DATA_TYPE
                                                      ,ORDINAL_POSITION
          FROM util.vwGetColumnInfoISC
         WHERE TABLE_CATALOG = @srcDatabase COLLATE Latin1_General_100_CI_AI
           AND TABLE_SCHEMA = @srcSchema COLLATE Latin1_General_100_CI_AI
           AND TABLE_NAME = @srcTable COLLATE Latin1_General_100_CI_AI
        ORDER BY
               ORDINAL_POSITION
    END TRY
    BEGIN CATCH
        DEALLOCATE cursorColumns;
        DECLARE cursorColumns SCROLL CURSOR FOR SELECT COLUMN_NAME
                                                      ,DATA_TYPE
                                                      ,ORDINAL_POSITION
          FROM util.vwGetColumnInfoISC
         WHERE TABLE_CATALOG = @srcDatabase COLLATE Latin1_General_100_CI_AI
           AND TABLE_SCHEMA = @srcSchema COLLATE Latin1_General_100_CI_AI
           AND TABLE_NAME = @srcTable COLLATE Latin1_General_100_CI_AI
        ORDER BY
               ORDINAL_POSITION
    END CATCH

    OPEN cursorColumns;

    FETCH FIRST FROM cursorColumns INTO @columnName,@columnType,@n;
    WHILE @@fetch_status = 0
    BEGIN
    SET @line = REPLICATE(' ',256);
    IF @columnType LIKE '%char'
    BEGIN
        SET @line = STUFF(@line,7,50,',LTRIM(RTRIM([t{alias}].[NewString]))');  -- strip leading and trailing spaces
        SET @line = REPLACE(@line,'{alias}',FORMAT(@n,'00'));
        SET @line = STUFF(@line,100,50,'AS {columnName}');
        SET @line = REPLACE(@line,'{columnName}',QUOTENAME(@columnName,'['))
    END
    ELSE
    BEGIN
        SET @line = STUFF(@line,7,50,',[src].{columnName}');
        SET @line = REPLACE(@line,'{columnName}',QUOTENAME(@columnName,'['))
        SET @line = STUFF(@line,100,50,'AS {columnName}');
        SET @line = REPLACE(@line,'{columnName}',QUOTENAME(@columnName,'['))
    END
    SET @sql += RTRIM(@line) + CHAR(13);
    FETCH NEXT FROM cursorColumns INTO @columnName,@columnType,@n;
    END

    -- Source Table
    -- Note: If the source table is in a different database than the target database then a synonym must be created!
    SET @line = REPLICATE(' ',256);
    SET @line = STUFF(@line,3,50,'FROM {srcSchema}.{srcTable} src');
    SET @sql += RTRIM(@line) + CHAR(13);

    -- Cross Apply
    FETCH FIRST FROM cursorColumns INTO @columnName,@columnType,@n;
    WHILE @@fetch_status = 0
    BEGIN
    SET @line = REPLICATE(' ',256);
    IF @columnType LIKE '%char'
    BEGIN
        SET @line = STUFF(@line,3,60,'CROSS APPLY dbo.fnPatExclude8K_Table([src].{columnName},''{pattern}'') t{alias}');
        SET @line = REPLACE(REPLACE(REPLACE(@line,'{columnName}',QUOTENAME(@columnName,'[')),'{alias}',FORMAT(@n,'00')),'{pattern}',@pattern);
        SET @sql += RTRIM(@line) + CHAR(13);
    END
    FETCH NEXT FROM cursorColumns INTO @columnName,@columnType,@n;
    END

    CLOSE cursorColumns;
    DEALLOCATE cursorColumns;

    SET @sql = STUFF(@sql,1,7,'SELECT ');

    -- Do not indent the following code block
    SET @sql =
'CREATE OR ALTER VIEW {tgtSchema}.{tgtTable}
AS
' + @sql
;

    SET @sql = REPLACE(@sql,'{srcSchema}',QUOTENAME(@srcSchema,'['));
    SET @sql = REPLACE(@sql,'{srcTable}',QUOTENAME(@srcTable,'['));
    SET @sql = REPLACE(@sql,'{tgtDatabase}',QUOTENAME(@tgtDatabase,'['));
    SET @sql = REPLACE(@sql,'{tgtSchema}',QUOTENAME(@tgtSchema,'['));
    SET @sql = REPLACE(@sql,'{tgtTable}',QUOTENAME(@tgtTable,'['));

    -- If debugging display generated code
    -- XML is used to overcome the 4000 character limit of PRINT
    IF @debug = 1
        SELECT CAST('<![CDATA[' + @sql + ']]>' AS XML);
    ELSE
    BEGIN
        -- Set execution context
        SET @DBExec = @tgtDatabase + N'.sys.sp_executesql';
        EXEC @DBExec @sql;
    END
END
GO

3) Cependant, il est possible d'utiliser des bases de données SQL + sys.databases dynamiques pour générer la requête requise sous la forme d'une requête UNION ALL. @Zhorov a fourni un excellent exemple. Il est également possible d'utiliser du SQL dynamique pour charger un curseur. Encore une fois, @Zhorov a fourni un excellent exemple, c'est-à-dire ajouter la déclaration du curseur au SQL dynamique, puis faire une boucle sur le curseur dans le code en aval. À l'avenir, je pourrai utiliser le code de @ Zhorov pour générer le code afin de créer la vue ci-dessous.

Cependant, après réflexion, comme je n'ai qu'à générer des vues sur environ 6 bases de données, j'ai décidé de créer "manuellement" une vue qui rejoint les bases de données avec lesquelles je dois travailler:

Version 1 (pour mes besoins immédiats):

CREATE   VIEW [util].[vwGetColumnInfoSYS]
AS
/* Returns column information from selected databases using system catalog views */
WITH cteDeaths
AS (
    SELECT 'Deaths'       AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM Deaths.sys.schemas sch
      JOIN Deaths.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN Deaths.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN Deaths.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN Deaths.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN Deaths.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteRLDXDth
AS (
    SELECT 'RLDXDth'     AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM RLDXDth.sys.schemas sch
      JOIN RLDXDth.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN RLDXDth.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN RLDXDth.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN RLDXDth.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN RLDXDth.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteRLDXED
AS (
    SELECT 'RLDXED'      AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM RLDXED.sys.schemas sch
      JOIN RLDXED.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN RLDXED.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN RLDXED.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN RLDXED.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN RLDXED.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteRLDXHosp
AS (
    SELECT 'RLDXHosp'    AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM RLDXHosp.sys.schemas sch
      JOIN RLDXHosp.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN RLDXHosp.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN RLDXHosp.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN RLDXHosp.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN RLDXHosp.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteCaped
AS (
    SELECT 'caped'       AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM caped.sys.schemas sch
      JOIN caped.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN caped.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN caped.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN caped.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN caped.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteHierep
AS (
    SELECT 'hierep'      AS TABLE_CATALOG
          ,sch.name       AS TABLE_SCHEMA
          ,tbl.name       AS TABLE_NAME
          ,col.name       AS COLUMN_NAME
          ,col.column_id  AS ORDINAL_POSITION
          ,typ.name       AS COLUMN_TYPE
          ,col.max_length AS MAX_LENGTH
          ,col.column_id
          ,col.precision
          ,col.scale
          ,col.collation_name
          ,col.is_nullable
          ,col.is_rowguidcol
          ,col.is_identity
          ,col.is_computed
          ,idx.name       AS index_name
          ,idx.type       AS index_type
          ,idx.type_desc  AS index_description
          ,idx.is_unique
          ,idx.data_space_id
          ,idx.ignore_dup_key
          ,idx.is_primary_key
          ,idx.is_unique_constraint
          ,idx.fill_factor
          ,idx.is_padded
          ,idx.is_disabled
          ,idx.is_hypothetical
          ,idx.allow_row_locks
          ,idx.allow_page_locks
          ,idx.has_filter
          ,idx.filter_definition
          ,idx.compression_delay
          ,ixc.key_ordinal
          ,ixc.partition_ordinal
          ,ixc.is_descending_key
          ,ixc.is_included_column
      FROM hierep.sys.schemas sch
      JOIN hierep.sys.tables tbl
        ON sch.schema_id = tbl.schema_id
      JOIN hierep.sys.columns col
        ON col.object_id = tbl.object_id
      JOIN hierep.sys.types typ
        ON typ.system_type_id = col.system_type_id
      LEFT JOIN hierep.sys.index_columns ixc
        ON col.object_id = ixc.object_id
        AND col.column_id = ixc.column_id
      LEFT JOIN hierep.sys.indexes idx
        ON ixc.object_id = idx.object_id
        AND ixc.index_id = idx.index_id
),
cteUnion
AS (
    SELECT *
      FROM cteDeaths
    UNION ALL
    SELECT *
      FROM cteRLDXDth
    UNION ALL
    SELECT *
      FROM cteRLDXED
    UNION ALL
    SELECT *
      FROM cteRLDXHosp
    UNION ALL
    SELECT *
      FROM cteCaped
    UNION ALL
    SELECT *
      FROM cteHierep
)
SELECT TOP 999999999999999999 *
  FROM cteUnion
ORDER BY
       TABLE_CATALOG
      ,TABLE_SCHEMA
      ,TABLE_NAME
      ,ORDINAL_POSITION
GO

Version 2 (pour une utilisation future, en particulier les informations d'index - j'espère améliorer cette vue à l'avenir pour inclure plus d'informations):

CREATE   VIEW [util].[vwGetColumnInfoISC]
AS
/* Returns column information from selected databases using INFORMATION_SCHEMA views */
WITH cteDeaths
AS (
    SELECT *
      FROM Deaths.INFORMATION_SCHEMA.COLUMNS
),
cteRLDXDth
AS (
    SELECT *
      FROM RLDXDth.INFORMATION_SCHEMA.COLUMNS
),
cteRLDXED
AS (
    SELECT *
      FROM RLDXED.INFORMATION_SCHEMA.COLUMNS
),
cteRLDXHosp
AS (
    SELECT *
      FROM RLDXHosp.INFORMATION_SCHEMA.COLUMNS
),
cteCaped
AS (
    SELECT *
      FROM caped.INFORMATION_SCHEMA.COLUMNS
),
cteHierep
AS (
    SELECT *
      FROM hierep.INFORMATION_SCHEMA.COLUMNS
),
cteUnion
AS (
    SELECT *
      FROM cteDeaths
    UNION ALL
    SELECT *
      FROM cteRLDXDth
    UNION ALL
    SELECT *
      FROM cteRLDXED
    UNION ALL
    SELECT *
      FROM cteRLDXHosp
    UNION ALL
    SELECT *
      FROM cteCaped
    UNION ALL
    SELECT *
      FROM cteHierep
)
SELECT TOP 999999999999999999 *
  FROM cteUnion
ORDER BY
       TABLE_CATALOG
      ,TABLE_SCHEMA
      ,TABLE_NAME
      ,ORDINAL_POSITION
GO

Je souhaite que SQL Server fournisse une telle vue globale prête à l'emploi, qui était l'essentiel de mes questions d'origine.

Enfin, j'ai écrit un générateur de code pour générer les vues dont j'ai besoin:

(Voir http://www.sqlservercentral.com/scripts/T-SQL/117890/ pour PatExclude8K):

SELECT * FROM @database.INFORMATION_SCHEMA.COLUMNS


0 commentaires

1
votes

Hé, j'avais un problème similaire à toi. Voici ce avec quoi j'ai fini, bien que dans un monde parfait, j'aimerais ajouter row_count par table et colonne data_type. La réponse à l'ajout de db aux informations de schéma, de table et de colonne est la fonction DB_NAME ()

select 
s.name schema_name_,
t.name table_name,
c.name col_name_,
idx.name index_type,
DB_NAME()
from sys.schemas s
join sys.tables t on s.schema_id = t.schema_id
join sys.columns c on t.object_id = c.object_id
left join sys.index_columns ic on c.object_id = ic.object_id and c.column_id = ic.column_id
left join sys.indexes idx on ic.index_id = idx.index_id and ic.object_id = idx.object_id
; 


0 commentaires