[英]how to find a specific column name from a table whose column value is matched?
[英]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.