Ładowanie wielu tabel z wykorzystaniem dynamic SQL

0

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
0

w while zrób sobie debuga i wyświetl i zobacz jakie masz kolumny


select * from ['+  @baza +'].[dbo].[TABELA]
select * from [dbo].['+ @DRUGA +']'
1

Komunikat jest jasny, któraś z tabel nie ma oczekiwanej struktury.

Puść to zaypytanie:


SELECT   'SELECT top 1  [Kol1],[Kol2],[Kol3],[Kol4] from [dbo].['+ TABLE_NAME +']
go' 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

Wynik wyświetl jako tekst, i to co wypluje puśc w osobnym query i zobacz, które się wywali

0

Wrzuciłem te selecty do while i wyrzuciło mi takie kolumny jakie powinny być.
Jeżeli chodzi o propozycję Panczo to wszytkie selecty po każdej z tabel zadziałały poprawnie, czyli żadna nie wywaliła.
Na prawde nie wiem co idzie nie tak, skoro chce załadować dosłownie dwie te same tabele.

1

to dodaj przed linijką:

EXEC sp_executesql @TABELKAA

print @TABELKAA

i zobacz zapytanie wywołujące błąd

0

Wyskakuje takie info

INSERT INTO [Baza].[dbo].[TABELA]([Kol1],[Kol2],[Kol3],[Kol4])
    SELECT [Kol1],[Kol2],[Kol3],[Kol4]

Teraz już wiem ustawiłem po prostu ilość znaków zmiennej na 300 i zadziałało xd.
Dzięki wielkie za pomoc :)

0

Mam jeszcze jeden pewien problem w konkekście tej procedury.
Otóż jeżeli użytkownik we wprowadzonym SELECT będzie chciał dodać aliansy, lub wyliczyć pewne kolumny, to podczas wykonywania INSERT INTO wywali procedurę z błędem.
Same nazwy kolumn można wyciągnąć z zapytania:

USE [Baza]
SELECT  COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Tabela'

I tu pojawia się problem i moje pytanie, czy i jak można wynik takiego zapytania zapisać jako tekst w zmiennej? Lub czy istnieje inna możliwość rozwiązania tego problemu?
Z góry dzięki za pomoc :)

1

Prościej by było jakbyś napisał jakiego silnika uzywasz., Bo tak to nie wiadomo co odpowiedzieć...

0

SQL Server Express Edition (12.0.5223.6), tyle wiem

0
Szymon 3Tears napisał(a):

Mam jeszcze jeden pewien problem w konkekście tej procedury.
Otóż jeżeli użytkownik we wprowadzonym SELECT będzie chciał dodać aliansy, lub wyliczyć pewne kolumny, to podczas wykonywania INSERT INTO wywali procedurę z błędem.
Same nazwy kolumn można wyciągnąć z zapytania:

USE [Baza]
SELECT  COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Tabela'

I tu pojawia się problem i moje pytanie, czy i jak można wynik takiego zapytania zapisać jako tekst w zmiennej? Lub czy istnieje inna możliwość rozwiązania tego problemu?
Z góry dzięki za pomoc :)

jak połączysz w jeden string to możesz do zmiennej varchar zapisać

1 użytkowników online, w tym zalogowanych: 0, gości: 1