Alterantywa dla Dynamic SQL

0

Hej,

mam pewien problem i w związku z nim zapytanie:

mama bazę składającej się z wielu tabel, każda zawiera dane o klientach z powiedzmy to odrębnych rejonów. Dodatkowo jest jedna tabela Dzialania_marketingowe która przechowuje dane o działaniach powiedzmy sprzedażowych, i w tej tabeli w kolumnie Nazwa_tabeli przechowuje informacje w której tabeli znajdują się dane o klientach których działania dotyczą.

Wiem że mogę to załatwić przez Dynamic SQL, co wygląda w skrócie tak (sory przykład pisany na szybko) :

 
DECLARE @Nazwa_tabeli nvarchar(max);
SET @Nazwa_tabeli = SELECT Nazwa_tabeli FROM Dzialania_marketingowe WHERE Id=1 --tutaj przypisuje do zmiennej nazwe tabeli z klientami które dotyczą 1-szej akcji, 
--jednak ogólnie akcje ma wybierać użytkownik (nei musi znać nazwy tabeli w której są dane klientów

exec('SELECT * FROM ' + @Nazwa_tabeli)

Przy bardziej złożonych zapytaniach wkurza mnie zapinanie wszystkiego w cudzysłowy i klejenia długiego zapytania żeby potem wrzucić je w exec.

Czy znacie jakąś alternatywę dla takiego rozwiązania? Chodzi o to by nie używać execa a za FROMem podawać nazwę bazy ze zmiennej do której dane są pobierane przez inne zapytanie?

Trochę pogooglałem i ciężko znaleźć jakąś alternatywę, googlam dalej będę wdzięczny jeśli podzielicie się swoimi doświadczeniami.

Pozdrawiam,
shag

1

Trzeba byc niespelna rozumu, by dawac uzytkownikowi mozliwość podania choć części SQL. Az się prosi o SQL-Injection.
A rozwiązanie jest proste - znormalizowac bazę - obejdzie się bez cudów.

0
thugshag napisał(a):

Hej,

Hej!
/ciach/

thugshag napisał(a):

Czy znacie jakąś alternatywę dla takiego rozwiązania? Chodzi o to by nie używać execa a za FROMem podawać nazwę bazy ze zmiennej do której dane są pobierane przez inne zapytanie?
Trochę pogooglałem i ciężko znaleźć jakąś alternatywę, googlam dalej będę wdzięczny jeśli podzielicie się swoimi doświadczeniami.

Tak, znamy - makra i parametry; aczkolwiek tu parametry pewnie nie zadziałają, natomiast makra - jak najbardziej.
Chociaż... parametr + myk z deklaracją własnej zmiennej (tak jak to zrobiłeś), a potem przypisanie do niej wartości i odpalenie wszystkiego za pomocą exec zadziała i dla parametrów.

Ale zapomniałeś dodać w czym w/w zapytania chcesz odpalać, czyli za pomocą jakiego języka i jakiej biblioteki DAL będziesz uruchamiał takie zapytania.
To, wbrew pozorom, istotne pytanie.

Przykładowe rozwiązanie dla Delphi i FireDAC;

var
  q: TFDQuery;
begin
  q := TADQuery.Create(nil);
  try
    q.ConnectionName := 'moje connection';
    q.SQL.Text       := 'select * from !TableName';

    q.MacroByName('TableName').Value := '[nazwa tabeli]';
    q.Open();
    // coś tam...
  finally
    q.Free;
  end;

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