Witam wszystkich,
Jestem w trakcie pracy nad procedurą w mssql, za pomocą której po podaniu nazwy bazy oraz zapytania SELECT będzie można załadować wszystkie znajdujące się w bazie tabele (mające takie same kolumny) do jednej tabeli (jest to konieczne do analiz w naszej firmie).
Żeby nie podawać jakiego typu mają być kolumny pierwszą tabelę ładuję za pomocą SELECT INTO, następne już za pomocą INSERT INTO. Jednak podczas wykonywania się kodu INSERT INTO wyskakuje błąd 'Invalid column name', choć kolumny mają dobre nazwy. I tutaj jest moja prośba o pomoc, jak zmienić kod żeby poprawnie ładowało dane.
Próbowałem również z klauzulą IF (pierwsza iteracja wykonuje SELECT INTO, w przeciwnym razie INSERT INTO) jednak wtedy ładowało kilkukrotnie pierwszą tabele.
DECLARE @baza VARCHAR(100)
set @baza = 'Baza'
DECLARE @bazan TABLE (siteid int)
INSERT @bazan
exec (N'SELECT COUNT(*)
FROM '+ @baza +'.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE'' ')
DECLARE @MAX INT
SET @MAX = (select cast(siteid as int) from @bazan)
DECLARE @TABELA TABLE (nazwa NVARCHAR(MAX), numer NVARCHAR(100))
INSERT @TABELA
exec(N'SELECT TABLE_NAME, ROW_NUMBER() OVER(order by TABLE_NAME ) as rows_numbers
FROM '+ @baza +'.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE''')
DECLARE @PIERWSZA NVARCHAR(128)
DECLARE @TABELKA NVARCHAR(128)
SET @PIERWSZA = (Select nazwa from @TABELA where numer =1)
SET @TABELKA =N'SELECT [Kol1],[Kol2],[Kol3],[Kol4]
INTO ['+ @baza +'].[dbo].[TABELA]
FROM ['+ @baza +'].[dbo].['+ @PIERWSZA +']'
EXEC sp_executesql @TABELKA
DECLARE @i int
SET @i =2
WHILE @i <= @MAX
BEGIN
DECLARE @DRUGA NVARCHAR(128)
DECLARE @TABELKAA NVARCHAR(128)
SET @DRUGA = (Select nazwa from @TABELA where numer = @i)
Select nazwa from @TABELA where numer =@i
SET @TABELKAA = N'INSERT INTO ['+ @baza +'].[dbo].[TABELA]([Kol1],[Kol2],[Kol3],[Kol4])
SELECT [Kol1],[Kol2],[Kol3],[Kol4] from [dbo].['+ @DRUGA +']'
EXEC sp_executesql @TABELKAA
SET @i = @i +1
END