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).