Запрос INFORMATION_SCHEMA.COLUMNS для всех баз данных? - PullRequest
1 голос
/ 09 октября 2019

Есть ли способ запроса INFORMATION_SCHEMA.COLUMNS по всем базам данных? Похоже, что USE db должно быть указано.

Я пробовал это, но ничего не возвращает при использовании PowerShell Invoke-Sqlcmd.

IF DB_ID('db') IS NOT NULL
BEGIN
    SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME LIKE 'BID_BY_CPT_SPECIAL'
    ORDER BY TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,ORDINAL_POSITION
    ;
END

Этот запрос используется в скрипте PowerShell.

$q = @"
DROP TABLE IF EXISTS #Temp;
SELECT DatabaseName=cast('' as varchar(100))
     , TABLE_NAME
     , COLUMN_NAME
     , DATA_TYPE
     , ORDINAL_POSITION
 Into  #Temp
 FROM INFORMATION_SCHEMA.COLUMNS
 Where 1=0

Declare @SQL varchar(max) = '
USE ? ;

Insert Into #Temp
SELECT DatabaseName=''?''
     , TABLE_NAME
     , COLUMN_NAME
     , DATA_TYPE
     , ORDINAL_POSITION
 FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE ''BID_BY_CPT_SPECIAL''
 ORDER BY TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,ORDINAL_POSITION
'

EXEC sp_MSforeachdb @SQL 

Select * From #Temp
"@

foreach ($db in $DatabaseInstances) {
    $r = Invoke-Sqlcmd -Query $q -ServerInstance $db

=== Обновление

Этот запрос работает с Invoke-Sqlcmd.

$q = @"
DROP TABLE IF EXISTS #Temp;
SELECT DatabaseName=cast('' as varchar(100))
    ,TABLE_NAME
    ,COLUMN_NAME
    ,DATA_TYPE
    ,ORDINAL_POSITION
    ,CHARACTER_MAXIMUM_LENGTH
    ,NUMERIC_PRECISION
    ,NUMERIC_SCALE
    ,IS_NULLABLE
Into  #Temp
FROM INFORMATION_SCHEMA.COLUMNS
Where 1=0

Declare @SQL varchar(max) = '
USE ? ;

Insert Into #Temp
SELECT DatabaseName=''?''
    ,TABLE_NAME
    ,COLUMN_NAME
    ,DATA_TYPE
    ,ORDINAL_POSITION
    ,CHARACTER_MAXIMUM_LENGTH
    ,NUMERIC_PRECISION
    ,NUMERIC_SCALE
    ,IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE ''$TableName''
 ORDER BY TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,ORDINAL_POSITION
'

EXEC sp_MSforeachdb @SQL 

Select * From #Temp
"@

1 Ответ

1 голос
/ 09 октября 2019

Взгляните на sp_MSforeachdb

Это позволит собрать данные в одну временную таблицу. Лично я бы переместил ваш WHERE в финал SELECT

Пример

SELECT DatabaseName=cast('' as varchar(100))
     , TABLE_NAME
     , COLUMN_NAME
     , DATA_TYPE
     , ORDINAL_POSITION
 Into  #Temp
 FROM INFORMATION_SCHEMA.COLUMNS
 Where 1=0

Declare @SQL varchar(max) = '
USE ? ;

Insert Into #Temp
SELECT DatabaseName=''?''
     , TABLE_NAME
     , COLUMN_NAME
     , DATA_TYPE
     , ORDINAL_POSITION
 FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE ''BID_BY_CPT_SPECIAL''
 ORDER BY TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,ORDINAL_POSITION
'

EXEC sp_MSforeachdb @SQL 

Select * From #Temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...