Select dynamicznych pól z tabeli

0

Dzień dobry,

Czy jest możliwe, aby lista pól do pobrania zapytaniem SELECT, była jako zapytanie pobierające listę pól z innej tabeli? Przykład.
Mam w tabeli Pola zapisane pola jako rekordy: pole1, pole2, pole3, pole4, pole5, pole6. Teraz w tabeli Dane mam pola o takich nazwach i rekordy. I teraz chciałbym coś takiego:

SELECT (SELECT nazwa_pola FROM Pola WHERE nazwa_pola IN ('pole1', 'pole4')) FROM Dane;

Jak ugryźć taki temat?

0

Przez pola rozumiesz kolumny tabeli?
Ta tabela Pola ma mieć coś w stylu potrzebnych konkretnych kolumn do następnego slececta?
Bo jeśli to coś takiego to masz od tego widoki w SQL

0
jurek1980 napisał(a):

Przez pola rozumiesz kolumny tabeli?
Ta tabela Pola ma mieć coś w stylu potrzebnych konkretnych kolumn do następnego slececta?
Bo jeśli to coś takiego to masz od tego widoki w SQL

To może rozszerzę. Mam tabelę Pola, gdzie jest jedna kolumna nazwa_pola. Dane w tej tabeli, to pole1, pole2, pole3, pole4, pole5, pole6. Są to nazwy kolumn w tabeli Dane, która zawiera 6 kolumn: pole1, pole2, pole3, pole4, pole5, pole6. No i oczywiście tabela ma jakieś dane.
I teraz chciałbym wyciągnąć dane z konkretnych kolumn tabeli Dane. Ale zamiast:


SELECT pole1, pole4 FROM Dane

Chciałbym użyć takiego zapytania jak w głównym poście. A potrzebuję tego, do bardziej rozbudowanego zapytania, które ma być bardziej uniwersalne, bo w jednej bazie, te dane, które będę wyciągał, są w kolumnach pole1 i pole4, a w innej mogą być w kolumnach pole3 i pole6. Warunek w tym zapytaniu wybierającym nazwy kolumn, de facto będzie inny. Jeśli da się to ogarnąć widokiem, to w jaki sposób?

0

No ale projekt prowadzisz w jakimś jezyku. jest jakiś kod w języku algorytmicznym, który jest klientem bazy ?
Java, C#, PHP itd

Lubie klimaty pewnych "dynamicznych" (ale mądrze zaprojektowanych), baz danych. NAWET jeśli jakis prosty przypadek by się dał wykonać w 100% w SQL-u, to i tak wymięknie jak życie przyniesie skomplikownaie.
Fajnie sie to robi w języku klienckim. Na wielu poziomach można zrobić, aż do (hipotetycznego-nic produkcyjnego chyba nie ma) generowania klas tego jezyka w locie

0
AnyKtokolwiek napisał(a):

No ale projekt prowadzisz w jakimś jezyku. jest jakiś kod w języku algorytmicznym, który jest klientem bazy ?
Java, C#, PHP itd

Lubie klimaty pewnych "dynamicznych" (ale mądrze zaprojektowanych), baz danych. NAWET jeśli jakis prosty przypadek by się dał wykonać w 100% w SQL-u, to i tak wymięknie jak życie przyniesie skomplikownaie.
Fajnie sie to robi w języku klienckim. Na wielu poziomach można zrobić, aż do (hipotetycznego-nic produkcyjnego chyba nie ma) generowania klas tego jezyka w locie

To będzie zapytanie wklejone do Subiekta GT jako zestawienie. Tworzę czysty SQL. Nie jest to żadna aplikacja. Gdybym tworzył aplikację, to wtedy bym sobie poradził.

0
Buster napisał(a):
AnyKtokolwiek napisał(a):

No ale projekt prowadzisz w jakimś jezyku. jest jakiś kod w języku algorytmicznym, który jest klientem bazy ?
Java, C#, PHP itd

To będzie zapytanie wklejone do Subiekta GT jako zestawienie. Tworzę czysty SQL. Nie jest to żadna aplikacja. Gdybym tworzył aplikację, to wtedy bym sobie poradził.

Z całą pewnoscią da się to zrobić procedurą SQL, ale nie pomogę

0

To co opisujesz, czyli jakieś gotowe, predefiniowane zapytania SQL rozwiązuje koncepcja widoków.
Czy te nazwy kolumn mają być jakoś dynamicznie zmieniane codzienie? Bo to wygląda na X/Y.
Wnioskując po tym, że kolumny nazywasz polami możesz nie znać koncepcji widoków więc wklejam link bo chyba subiekt był na SQL Server Express
https://www.plukasiewicz.net/SQL/Views

0

Subiekt to SQL Server, więc:

  1. Dynamiczny SQL
    declare @listapol as nvarchar(600) = 'pole1,pole4';
    declare @command as nvarchar(600);
    set @command = 'select '+@listapol+' from ....';
    EXEC (@command);
    Pisane z ręki, zamiast exec lepsze jest sp_executelsql, bardziej zalecane, nie pamiętam składni.

  2. Java, C#, PHP
    Java nie wiem, PHP nie, C# jak najbardziej: szukaj pod hasłem CLR

0
jurek1980 napisał(a):

To co opisujesz, czyli jakieś gotowe, predefiniowane zapytania SQL rozwiązuje koncepcja widoków.
Czy te nazwy kolumn mają być jakoś dynamicznie zmieniane codzienie? Bo to wygląda na X/Y.
Wnioskując po tym, że kolumny nazywasz polami możesz nie znać koncepcji widoków więc wklejam link bo chyba subiekt był na SQL Server Express
https://www.plukasiewicz.net/SQL/Views

Pachnie jak XY.

Do robienia extenszynów do Subiekta jest Sfera czy Strefa, ale nie miałem głębszego kontaktu z tymi produktami

0
niemand napisał(a):

Pisane z ręki, zamiast exec lepsze jest sp_executelsql, bardziej zalecane, nie pamiętam składni.

  1. Java, C#, PHP
    Java nie wiem, PHP nie, C# jak najbardziej: szukaj pod hasłem CLR

Nie mam pojęcia co chciałeś powiedzieć

0

Tak jak napisał @niemand, w takim wypadku zostaje Ci dynamic sql. Z tabeli sys.columns albo information_schema.columns możesz nawet pobierać nazwy kolumn w zależności od nazwy tabeli oraz metadane i kleić dynamiczne zapytania z czegokolwiek.

Jednak na dłuższą metę trudno taki kod utrzymać i nie wiadomo o co tam chodzi. Jeśli zmieni się struktura, kod się posypie. Może prościej wstawić ify, i w zależności od argumentu pobierać dane z jednej albo drugiej tabeli (do CTE albo TMP Table) a na koniec złożyć jeden SELECT który zawsze ma tę samą strukturę?

1

@AnyKtokolwiek: Nie mam pojęcia co chciałeś powiedzieć

chciałem powiedzieć, że moduły operujące na bazie po stronie serwera (procedury, funkcje..) można pisać również w C#/VB.NET...., czyli w tym przypadku skleić treść zapytania jako stringa - podobnie jak w dynamicznym SQL i potem go wywołać - wszystko w C# jako dll po stronie serwera.

SqlConnection conn = new SqlConnection("context connection = true");
string cmd_txt = "select okres_od,nadal,okres_do from Okresy_Zatr1 ";
cmd_txt += "where id_osoby1 = " + id_osoby.ToString() + " and kod_firmy = '" + kod_firmy + "' ";
cmd_txt += "order by okres_od";

SqlCommand cmd = new SqlCommand(cmd_txt, conn);
SqlDataRecord dtrec = new SqlDataRecord(pola);
conn.Open();
SqlDataReader dtrdr = cmd.ExecuteReader();
if (!dtrdr.HasRows)
{
...........
}
while (dtrdr.Read())
{
........
}

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