SQL Server: 所有库、所有表、所有列查询值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yenange/article/details/82783294
--1. 创建全局临时表
IF OBJECT_ID('tempdb..##tmp') IS NOT NULL DROP TABLE ##tmp
CREATE TABLE ##tmp(dbName NVARCHAR(100), tableName NVARCHAR(200),pkName NVARCHAR(100),pkValue NVARCHAR(100))

--2. 构建 db 列表的表变量
DECLARE @db TABLE (
	[dbId] INT IDENTITY(1,1) PRIMARY KEY,
	[dbName] NVARCHAR(MAX)
)
INSERT INTO @db(dbName)
SELECT d.name FROM sys.databases AS d WHERE d.name NOT IN ('master','tempdb','model','msdb')

DECLARE @i INT,@imax INT,@sql NVARCHAR(MAX),@search NVARCHAR(100)
SET @search='李四'  
SELECT @i=MIN([dbId]),@imax=MAX([dbId]) FROM @db;

--3. 遍历所有db , 将数据插入到全局临时表
WHILE @i<=@imax
BEGIN
	SELECT @sql='use '+dbName +'  ' FROM @db WHERE [dbId]=@i;
	SET @sql=@sql+'
DECLARE @sql NVARCHAR(MAX)
SET @sql=(
SELECT ''union all select db_name() as dbName,''''''+t.name+'''''' as tableName, ''''''
	+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +'''''' as pkName, ''
	+''[''+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +''] as pkValue from ''+t.name 
	+ '' with(nolock) where ''
	+ STUFF((SELECT ''or cast([''+c2.name+''] as nvarchar(max)) = N'''''+@search+''''' '' FROM sys.[columns] AS c2 WHERE c2.[object_id]=t.[object_id]
	        AND EXISTS(
				SELECT 1 FROM sys.types AS p WHERE p.name IN (''text'',''ntext'',''char'',''nchar'',''varchar'',''nvarchar'')
				AND p.system_type_id=c2.system_type_id 
			)
	FOR XML PATH('''')),1,2,'''')+'';'' 
FROM sys.tables AS t FOR XML PATH('''')) 
SET @sql=REPLACE(@sql,'';'',''
'')
SET @sql=STUFF(@sql,1,9,'''')
print @sql

insert into ##tmp(dbName,tableName,pkName,pkValue)
EXEC(@sql)	
'
	EXEC(@sql)
	SET @i=@i+1;
END

--4. 查询最终的全局临时表
SELECT * FROM ##tmp;

猜你喜欢

转载自blog.csdn.net/yenange/article/details/82783294