So I have a list of tables that I want (with wildcards)
x
CREATE TABLE [config].[datalist](
[id] [int] IDENTITY(1,1) NOT NULL,
[order] [int] NULL,
[dbname] sysname NULL,
[schemaname] sysname NULL,
[tablename] sysname NULL
)
GO
SET IDENTITY_INSERT [config].[datalist] ON
GO
INSERT [config].[datalist] ([id], [order], [dbname], [schemaname], [tablename]) VALUES (1, 1, N'TEST', N'audit*', N'*')
GO
INSERT [config].[datalist] ([id], [order], [dbname], [schemaname], [tablename]) VALUES (7, 2, N'TEST', N'conversie', N'BR')
GO
INSERT [config].[datalist] ([id], [order], [dbname], [schemaname], [tablename]) VALUES (8, 3, N'TEST', N'datalibrary', N'T*')
GO
INSERT [config].[datalist] ([id], [order], [dbname], [schemaname], [tablename]) VALUES (9, 3, N'BIML', N'*', N'*')
GO
SET IDENTITY_INSERT [config].[datalist] OFF
GO
SELECT [id]
,[order]
,[dbname]
,[schemaname]
,[tablename]
FROM [UITWISSEL].[config].[datalist]
That gives me
id order dbname schemaname tablename
1 1 TEST audit* *
7 2 TEST conversie BR
8 3 TEST datalibrary T*
9 3 BIML * *
Now what I need is a list of all tables mentioned in the table config.datalist
So I want a list of:
id 1) all tables in database TEST
of which the schemaname starts with audit
id 7) all tables in database TEST
in the schema conversie
with the name BR
id 8) all tables in database TEST
in schema ‘datalibrary’ of which the name starts with a T
id 9) all tables in database BIML
in all schema’s
I have the following code but I this works only for the database BIML
.
How to get this code to work for all databases mentioned in config.datalist.dbname?
select distinct t.name as TableName
, 'SELECT * FROM ' + quotename(replace(replace(ds.[dbname] ,'[',''),']',''))+'.'+
quotename(s.name)+'.'+
quotename(t.name) AS selectquery
,s.name as schemaname
,ds.[order]
from BIML.sys.schemas s
left join BIML.sys.tables t on s.schema_id = t.schema_id
inner join [UITWISSEL].[config].[datalist] ds on s.name like replace(ds.schemaname,'*','%') COLLATE DATABASE_DEFAULT
inner join [UITWISSEL].[config].[datalist] dt on t.name like replace(ds.tablename,'*','%') COLLATE DATABASE_DEFAULT
order by ds.[order] , s.name, t.name
That gives me
TableName selectquery schemaname order
connections SELECT * FROM [BIML].[config].[connections] config 3
FilesToImport SELECT * FROM [BIML].[config].[FilesToImport] config 3
Advertisement
Answer
declare @i as int = 1
declare @db_list table (id int identity(1,1), dbname sysname, [order] int)
declare @resultlist table ([order] int,dbname sysname, schemaname sysname, tablename sysname, selectquery nvarchar(4000))
declare @act_dbname sysname
declare @act_order int =1
declare @sql as nvarchar(4000)
insert into @db_list
select distinct dbname, [order] from UITWISSEL.[config].[datalist] order by [order]
while @i <= (select max(id) from @db_list)
BEGIN
set @act_dbname = (select dbname from @db_list where id = @i)
set @act_order = (select [order] from @db_list where id = @i)
set @sql = '
select distinct
'+ cast(@act_order as varchar(4)) + ' as [order]
,'''+ @act_dbname +''' as dbname
,s.name as schemaname
,t.name as tablename
, ''SELECT * FROM '' + quotename('''+ @act_dbname + ''')+''.''+
quotename(s.name)+''.''+
quotename(t.name)
AS selectquery
from '+ @act_dbname + '.sys.schemas s
left join '+ @act_dbname + '.sys.tables t on s.schema_id = t.schema_id
inner join [UITWISSEL].[config].[datalist] ds on s.name like replace(ds.schemaname,''*'',''%'') COLLATE DATABASE_DEFAULT
inner join [UITWISSEL].[config].[datalist] dt on t.name like replace(ds.tablename,''*'',''%'') COLLATE DATABASE_DEFAULT
order by [order] , s.name, t.name
'
print @sql
insert into @resultlist exec sp_executesql @sql
set @i = @i+1
END
select * from @resultlist order by [order], schemaname, tablename