Dynamiczne query - procedura

0

Panowie czy jest ktos w stanie mi pomoc z dynamiczna procedura w sql

Mam 100 tabel praktycznie takich samych i nie chciałbym robić dla każdej procedury stad pomysł o dynamicznym query

Jednakże coś nie hula tylko nie mogę znaleźć miejsca gdzie ...

create or alter procedure Tab
(
@z  nvarchar(50) = ISNULL ,
@s varchar(30) = ISNULL ,
@l nvarchar(30) = ISNULL)
as 
begin
Declare @SQL NVARCHAR(50)

set @sql = N'select * from '+@l+' as p join z as z on p.C=z.C where '+@z+' in (home, away) and p.s = '+@s+' and z = '+@z

exec (@sql)
go
0

Może home i away wrzuć w ciapki: '

0
set @sql = N'select * from '+@l+' as p join z as z on p.C=z.C where '+@z+' in (''home'', ''away'') and p.s = '+@s+' and z = '+@z
0

a co masz w l, z i s?

0
create or alter procedure Tab @z nvarchar(50) = NULL , @s varchar(30) = NULL , @l nvarchar(30) = NULL 
as 
begin 
declare @SQL NVARCHAR(50) 
set @sql = N'select * from '+@l+' as p join z as z on p.C=z.C where '+@z+' in (home, away) and p.s = '+@s+' and z = '+@z 
exec (@sql) 
go
0

zmienne ktore bede wpisywal przy exec. ( przy deklaracji tez nie dziala ) -

KONKRETNIE JAKIE WARTOŚCI PRZEKAZUJESZ DO TYCH ZMIENNYCH????? JAK WYGLĄDA DDL P I Z???

0

OK bede odpowiadal w komentarzach

Troche zmienilem ta procedure kod ponizej :

create or alter procedure Tabela  

	@zwyciezca  nvarchar(50) = null ,
	@season nvarchar(50) = null ,
	@liga nvarchar(50) = null
as 
begin
	Declare @SQL NVARCHAR(max);
	set @SQL = N'select * from ' + @liga + ' as p 
        join zwyciezcy z on p.Country=z.Country 
        where '+ @zwyciezca +' in ( ''home'' , ''away'' ) 
        and p.season = ' + @season + ' and z.zwyciezcy = ' + @zwyciezca 
		 print @sql
exec (@sql)
go

kod joina :

select top 10 IDPOL , p.country, p.league, p.Season, data, time ,home, away  from POL p
join zwyciezcy z
on p.Country=z.Country 
where p.Season='2012/2013'
and z.Zwyciezca='Slask Wroclaw'
and (home = 'Slask Wroclaw' or away  = 'Slask Wroclaw')

widok joina:

IDPOL	country	league	Season	data	time	home	away	
4	Poland	Ekstraklasa	2012/2013	2012-08-18	14:45:00.0000000	Widzew Lodz	Slask Wroclaw	
14	Poland	Ekstraklasa	2012/2013	2012-08-26	13:30:00.0000000	Slask Wroclaw	Korona Kielce	
23	Poland	Ekstraklasa	2012/2013	2012-09-02	16:00:00.0000000	Slask Wroclaw	Ruch	
25	Poland	Ekstraklasa	2012/2013	2012-09-14	17:00:00.0000000	Podbeskidzie	Slask Wroclaw	
38	Poland	Ekstraklasa	2012/2013	2012-09-23	13:30:00.0000000	Slask Wroclaw	GKS Belchatow	
46	Poland	Ekstraklasa	2012/2013	2012-09-30	13:30:00.0000000	Gornik Z.	Slask Wroclaw	
55	Poland	Ekstraklasa	2012/2013	2012-10-07	16:00:00.0000000	Slask Wroclaw	Polonia Warszawa	
62	Poland	Ekstraklasa	2012/2013	2012-10-21	13:30:00.0000000	Lechia Gdansk	Slask Wroclaw	
70	Poland	Ekstraklasa	2012/2013	2012-10-28	13:30:00.0000000	Slask Wroclaw	Zaglebie	
80	Poland	Ekstraklasa	2012/2013	2012-11-05	17:30:00.0000000	Pogon Szczecin	Slask Wroclaw	

wyskakuja 2 bledy albo:
Incorrect syntax near '@sql'.
Incorrect syntax near ')'.

0
create or alter procedure Tabela @zwyciezca nvarchar(50) = null , @season nvarchar(50) = null , @liga nvarchar(50) = null 
as 
begin 
Declare @SQL NVARCHAR(max); 
set @SQL = N'select * from ' + @liga + ' as p join zwyciezcy z on p.Country=z.Country where ( home=z.zwyciezcy or away=z.zwyciezcy) and p.season = ''' + @season + ''' and z.zwyciezcy = ''' + @zwyciezca + ''''
print @sql
 exec (@sql) 
go
0

Probowalem tez i tak i dalej to samo ....

create or alter procedure Tabela  

@zwyciezca  nvarchar(50) = 'Slask Wroclaw' ,
@season nvarchar(50) = '2012/2013' ,
@liga nvarchar(50) = 'POL'
as 
begin
Declare @SQL NVARCHAR(max)
set @SQL = 'select * from ' + @liga + ' as p 
        join zwyciezcy z on p.Country=z.Country 
        where ( p.home =  ''' + @zwyciezca + '''   OR  p.away  = ''' + @zwyciezca + ''' ) 
        and p.season = ''' + @season + ''' and z.zwyciezcy = ''' + @zwyciezca + ''''
		 print @sql
exec @sql
go
1

Zamiast go, daj end. Brakuje Ci "END" na końcu definicji procedury (jeśli masz BEGIN to trzeba dać też END).

0

Dzieki Jana

Brakowalo END i nie wiem ile bym tego szukal to bym na to nie wpadl :D

Teraz jeszcze pytanie jak odpalacie takie procedury >?

EXECUTE sp_executesql @sql i zmienne ?

1

Jeśli masz 100 "prawie takich samych tabel", to znaczy, że masz schrzanioną architekturę. Zamiast walczyć z objawami poprzez generowanie sql (bardzo podatne na sql injection, a jednocześnie bardzo trudne do utrzymania, kłopot z FK, a co za tym idzie z zagwarantowaniem spójności danych) wylecz chorobę - utwórz jedną, trochę bardziej elastyczną tabelę i ewentualne słowniki do niej.

0
/* PROCEDURA */
CREATE OR ALTER PROCEDURE p_Tabela 
	@In_zwyciezca NVARCHAR(50), 
	@In_season NVARCHAR(50), 
	@In_liga NVARCHAR(50)
AS 
BEGIN 
	DECLARE @v_SQL NVARCHAR(MAX); 
	SET @v_SQL = N'SELECT * 
		FROM ' + @In_liga + ' p 
			JOIN zwyciezcy z ON p.Country = z.Country
		WHERE (home = z.zwyciezcy OR away = z.zwyciezcy) 
			AND p.season = ''' + @In_season + ''' 
			AND z.zwyciezcy = ''' + @In_zwyciezca + ''''
	PRINT @v_SQL
	EXEC (@v_SQL)
 END;

 /* wywolanie */
 EXECUTE p_Tabela
	 @In_zwyciezca = 'Slask Wroclaw',
	 @In_season = '2012/2013',
	 @In_liga = 'POL'
0

Bardzo rzadko używam dynamicznego SQL-a z reguły jak muszę zrobić pivota, a nie znam wszystkich wartości... Patrząc jednak na to co pokazujesz to przychylam się do wypowiedzi @ŁF, bo to wygląda jakbyś każdą ligę/kraj trzymał w osobnej tabeli. To projektowo się nie obroni.

0

OK to może tak 50 tabel ma identyczne kolumny zmienia się tylko kraj
a 50 tabel ma dodatkowo 10 kolumn więcej

  1. Czy opłaca się tworzyć jedna duza z nullami dla polowy
  2. czy stworzyć dwie i powrzucać tam dane w zależności od kraju
  3. czy podzielić każda z osobna.

Bardzo dziękuje wszystkim za poświęcony czas jak wrócę do domu to wkleję działające query żeby ktoś mógł tez skorzystać z tego tematu z podobnym problemem

1

Pisząc te 3 punkty - od razu sam powinieneś sobie odpowiedzieć na pytanie, że 2 table to już będzie o niebo lepsze rozwiązanie niż to co masz teraz. Czy powinna być 1 tabela ? Hmm pewnie to zależy jaki typ ma te 10 dodatkowych kolumn.

A najlepiej to wrzuć wszystko wspólne do 1 tabeli i do 2 tylko pola dodatkowe . To najbardziej logiczne rozwiązanie (które w sumie powinno nasuwać się z logiki biznesowej samych tabel jak sądzę).

0

Pytanie co jest w tych dodatkowych 10 kolumnach?

0

w dodatkowych tabela sa **Liczby **

bardziej szczegolowe dane w tym wypadku ilosc strzelonych/ straconych bramek kartki zolte , kartki czerwone itd ...

0

To nie ma o czym gadać to są taden hierachiczne, na szybko to co pokazujesz to jest tabela meczy, cała reszta to "zdarzenia meczowe", czyli połaczyłbym to z tabela dodatkową np. zdarzenia w relacji jeden do wielu mecz->zdarzenia, a w zdarzeniach kolumny: id, id_mecz, zdarzenie, ilość, zawodnik i przykładowo wpisy"

1,1,Czerwona kartka, 1,1
1,1,Bramka zdobyta,2,2
1,1,Bramka zdobyta,1,10

Trzbe by się zastanowić dokładnie, bo jakbyś chciał dopisać ile razy użyto VAR to przepudujesz 100 tabel? Bo w proponowanym rozwiązaniu dojdzie ci kolejne zdarzenie bez ruszania struktury...

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