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.
6 Réponses :
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.
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.
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
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
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
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.
J'ai vu ce lien avant de poster sur SO. EXEC sp_MSforeachdb ne répond pas à mes besoins.
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
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 ;
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).