Artur Wabia

Artur Wabia Analityk Rynku,
Barlinek S.A.

Temat: Union - SP

Witam serdecznie

potrzebuję pomocy w zakresie procedury która będzie miała za zadanie Tworzyć lub modyfikować View w którym przy pomocy union all łączone są Tabele o tej samej strukturze, lista tych Tabel będzie Tworzona jako łączenie stałego fragmentu tekstu i selecta do tabelki w której przy pomocy 0/1 są wskazania do tego czy dane ID łączone ze stałym fragmentem tekstu ( nazwa Tabeli ) ma być brana do Uniona

przykład ( budzety projektów ) - przechowywane w osobnych tabelach nazwa B_(numer projektu)
w drugiej tabeli o strukturze ([numer projektu], [CZY ROZLICZAC] wartość 0/1 .

Jeśli CZY ROZLICZAC = 1 to Tabela B_(numer projektu) ma być w VIEWS zawierający union tej tabeli .... itd.

Mam nadzieję że napisałem czytelnie .

Z góry dziękuję za pomoc
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Artur Wabia

Artur Wabia Analityk Rynku,
Barlinek S.A.

Temat: Union - SP

powrót do tematu bo go nie ugryzłem
Odpytuję
SELECT
tbl.name As TableName
from sys.tables tbl
inner join sys.schemas sch on tbl.schema_id = sch.schema_id
where tbl.name like '%T'
ORDER BY tbl.name
dostaję z tego wynik

B_0301_T
B_0304_T
B_0306_T
B_0307_T
B_0309_T
B_0310_T
B_0312_T
B_0313_T
B_0314_T
B_0315_T

i teraz potrzebuję Procedurę która zrobi create or alter View

select * from B_0301_T
union all
select * from B_0304_T
union all itd do końca selecta pierwszego

Tych tabelek będzie przybywać i rozwiazań z dynamiczną liczbą tabelek również więc bardzo przydałby mi się przykład jak takie problemy rozwiąząć .

Jeszcze raz z góry dzięki za pomoc
Nikodem Dobrzański

Nikodem Dobrzański Architekt systemu,
BizTech Konsulting
S.A.

Temat: Union - SP

Jaka serwer danych? Jaka jego wersja? Bo nie określiłeś tego na początku.
Załóżmy, że to MS SQL.

Aby utworzyć widok, trzeba zadeklarować na stałe obiekt/y danych, z których czerpie on dane. Przez obiekty, mówimy tu o tablicach, widokach, funkcjach zwracających tablice itd.
CREATE / ALTER databaseName.owner.viewName as
SELECT ...

Jak zatem utworzyć widok dynamicznie?
Na początku tworzymy sobie zmienną, która będzie przechowywała dla Nas polecenie np. utworzenia widoku.
declare @viewGenerator varchar(max); -- w przypadku wersji 2000 jesteśmy ograniczeni do 8000 znaków

set @viewGeneratror = 'create view databaseName.owner.viewName as select '
set @viewGenerator = @viewGenerator + 'tu kolumny i obiekty, z których czerpiemy dane'

Nadszedł czas na wykonanie utworzenia widoku. Najprościej to zrobić przez wykonanie polecenia
exec(@viewGenerator)

konto usunięte

Temat: Union - SP

pomysł z widokiem jest do kitu ze względu na wydajność!
to potworek

lepiej było by zrobić tabelę tymczasową i tam insertować dane z poszczególnych tabel a na końcu dodać indeksy na odpowiednie kolumny
Nikodem Dobrzański

Nikodem Dobrzański Architekt systemu,
BizTech Konsulting
S.A.

Temat: Union - SP

To, co napisał Przemek, ma sens. W miarę, jak będzie Tobie przybywać danych, będzie się wydłużał czas przeszukania wszystkich obiektów. Osobiście, zrobiłbym w tym przypadku stałą tablicę, do której ładowałbym dane + okresowa reindeksacja.
Trzymanie danych w wielu obiektach ma jeden sens - wtedy, gdy chcesz te dane w jakiś sposób spartycjonować, aby przyspieszyć wyszukanie wśród olbrzymiej części zbioru. Zazwyczaj dzieli się takie dane po dacie, np. wstawienia. Potem odpowiednia procedura przeszukuje odpowiednie obiekty, łączy z nich dane i wyrzuca wynik.
A widok nie jest zły, jest szybszy, niż select, bo serwer ma już gotowy plan zapytania, a nie musi go tworzyć.

konto usunięte

Temat: Union - SP

Nikodem D.:
To, co napisał Przemek, ma sens. W miarę, jak będzie Tobie przybywać danych, będzie się wydłużał czas przeszukania wszystkich obiektów. Osobiście, zrobiłbym w tym przypadku stałą tablicę, do której ładowałbym dane + okresowa reindeksacja.
Trzymanie danych w wielu obiektach ma jeden sens - wtedy, gdy chcesz te dane w jakiś sposób spartycjonować, aby przyspieszyć wyszukanie wśród olbrzymiej części zbioru. Zazwyczaj dzieli się takie dane po dacie, np. wstawienia. Potem odpowiednia procedura przeszukuje odpowiednie obiekty, łączy z nich dane i wyrzuca wynik.
A widok nie jest zły, jest szybszy, niż select, bo serwer ma już gotowy plan zapytania, a nie musi go tworzyć.


I ten plan zapytania wygenerowany podczas tworzenia widoku będzie używany do końca istnienia wszechświata? Jeśli tak, to ktoś tę bazę nieźle spieprzył.

konto usunięte

Temat: Union - SP

Artur W.:
powrót do tematu bo go nie ugryzłem
Odpytuję
SELECT
tbl.name As TableName
from sys.tables tbl
inner join sys.schemas sch on tbl.schema_id = sch.schema_id
where tbl.name like '%T'
ORDER BY tbl.name
dostaję z tego wynik

B_0301_T
B_0304_T
B_0306_T
B_0307_T
B_0309_T
B_0310_T
B_0312_T
B_0313_T
B_0314_T
B_0315_T

i teraz potrzebuję Procedurę która zrobi create or alter View

Nie, nie potrzebujesz (procedury która będzie robiła create albo alter view) :)

http://www.mssqltips.com/sqlservertip/1160/execute-dyn...

Możesz tworzyć i wykonywać zapytania SQL dynamicznie.
... ta sytuacja to dość dobra ilustracja tego, jak jedna błędna decyzja projektowa, wymusza pojęcie kolejnych błędnych decyzji.Ten post został edytowany przez Autora dnia 28.04.14 o godzinie 17:38
Nikodem Dobrzański

Nikodem Dobrzański Architekt systemu,
BizTech Konsulting
S.A.

Temat: Union - SP

Szymonie,

Oczywiście, że plan zapytania zależy od statystyk i indeksów. I przy różnego rodzaju zapytaniach do tego samego widoku może obliczać różne plany i wybierać ten, który ma najniższy koszt. Ale to już zakres zarządzania bazą, a nie deweloperki.

Następna dyskusja:

Klauzula "UNION"




Wyślij zaproszenie do