簡體   English   中英

如何列出其特定表中的列具有特定類型的所有數據庫?

[英]How to list all databases whose column from a specific table has a specific type?

我想列出所有具有特定名稱的數據庫,並且其特定表中的列具有特定類型(如DATE)

要獲取具有特定名稱的所有數據庫:

SELECT [name] FROM [sysdatabases] WHERE [name] like 'myDBname_%'

要獲取所有列的特定類型:

select TABLE_CATALOG,TABLE_NAME, COLUMN_NAME, DATA_TYPE from myDBname_something.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'A_SPECIFIC_TABLE_NAME' 

如何鏈接這兩個請求? 換句話說,對於第一個請求的每個結果,如何獲得第二個請求的結果?

這是另一個不使用任何循環或游標的選項。 我正在使用sys.database生成單個select語句。 除非您有很多數據庫,否則與基於循環的解決方案相比,這不會有太多的性能提升。 但是我真的不喜歡游標和循環,這是一種構建動態sql以避免使用循環的相當簡單的方法。

DECLARE @SQL NVARCHAR(MAX) = '' --need to initialize to empty string
    , @TableToFind sysname = 'YourTableName'

SELECT @SQL = @SQL + 'select TABLE_CATALOG, TABLE_NAME, COLUMN_NAME, DATA_TYPE from [' + db.name + '].INFORMATION_SCHEMA.COLUMNS  where TABLE_NAME = @TableToFind UNION ALL '
FROM sys.databases db
WHERE [state] = 0 --only gets online multi user databases
    AND name LIKE 'myDBname_%'

IF LEN(@SQL) > 0
BEGIN
    SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 10)

    SELECT @SQL
    --uncomment the line below when you are comfortable the dynamic sql generated will function.
    --EXEC sp_executesql @SQL, N'@TableToFind sysname', @TableToFind = @TableToFind
END

您可以在系統proc sp_MSforeachdb中將第二個查詢作為參數執行

EXECUTE master.sys.sp_MSforeachdb 'select TABLE_CATALOG,TABLE_NAME, COLUMN_NAME, DATA_TYPE from [?].INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = ''A_SPECIFIC_TABLE_NAME'' '

如果只想過濾某些數據庫,則可以在TABLE_CATALOG列上向第二個查詢添加其他過濾器。 TABLE_CATALOG是數據庫名稱。

如果要確保沒有沒有符合篩選條件的任何列的數據庫沒有任何空結果,則可以在查詢之前放置IF EXISTS():

    EXECUTE master.sys.sp_MSforeachdb 'IF EXISTS(SELECT * from [?].INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = ''A_SPECIFIC_TABLE_NAME'')
      select TABLE_CATALOG,TABLE_NAME, COLUMN_NAME, DATA_TYPE from [?].INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = ''A_SPECIFIC_TABLE_NAME'' '

在循環中使用動態SQL來獲取數據庫名稱或將游標使用動態SQL

方法1:使用循環

Declare @ssql nvarchar(max),@DBName varchar(100),@rowcount int,@datatype varchar(10)

Create table #temp(id int identity(1,1) ,DBName varchar(100))

set @rowcount=0
set @datatype='int'

Insert into #temp(DBName)
SELECT [name]  FROM sys.[sysdatabases] WHERE [name] like 'MyDBName%'

while @rowcount<=1
begin

select @DBName=DBName from #temp where id=@rowcount

set @ssql=N'select TABLE_CATALOG,TABLE_NAME, COLUMN_NAME, DATA_TYPE from '+@DBName+'.INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME in (select TABLE_NAME from '+@DBName+'.INFORMATION_SCHEMA.TABLES where TABLE_TYPE=''BASE TABLE'')
and DATA_TYPE='''+@datatype+''''

--select @ssql
exec sp_executesql @ssql

set @rowcount=@rowcount+1
end

方法2:光標

    Declare @ssql nvarchar(max),@DBName varchar(100),@rowcount int,@datatype varchar(10)
set @rowcount=0
set @datatype='int'
DECLARE cursorDBName CURSOR -- Declare cursor
FOR

SELECT [name]  FROM sys.[sysdatabases] WHERE [name] like 'MyDBName%'
OPEN cursorDBName -- open the cursor

FETCH NEXT FROM cursorDBName

 INTO @DBName

WHILE @@FETCH_STATUS = 0

BEGIN

 set @ssql=N'select TABLE_CATALOG,TABLE_NAME, COLUMN_NAME, DATA_TYPE from '+@DBName+'.INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME in (select TABLE_NAME from '+@DBName+'.INFORMATION_SCHEMA.TABLES where TABLE_TYPE=''BASE TABLE'')
and DATA_TYPE='''+@datatype+''''

--select @ssql
exec sp_executesql @ssql

 FETCH NEXT FROM cursorDBName

   INTO @DBName
END

CLOSE cursorDBName -- close the cursor

DEALLOCATE cursorDBName 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM