Mam tabelę (nie zaprojektowaną przeze mnie), która ma 20 kolumn o różnych nazwach. Oznacza to, że w zależności od rodzaju rekordu, którego szukasz, odpowiednia nazwa kolumny może ulec zmianie.
Możliwe nazwy kolumn są przechowywane w innej tabeli, którą mogę bardzo łatwo wyszukać.
Dlatego zapytanie, którego tak naprawdę szukam, wygląda mniej więcej tak:
SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type),
Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type)
FROM Tbl1
WHERE Type = @Type
Oczywiście to nie działa, więc jak mogę uzyskać podobny wynik?
„
Próbowałem zbudować ciąg zapytania i
Okazuje się, że użyłem niepoprawnego zapytania do zbudowania dynamicznego SQL i jako taki zbudowałem pusty ciąg. SQL Server zdecydowanie poprawnie wykonał pusty ciąg.EXECUTE
go ing, ale to po prostu zwraca„ Polecenia zakończone pomyślnie ”i nie wydaje się, aby zwrócił zestaw wierszy.
Zauważ, że powód, dla którego muszę to mieć miejsce, zamiast prostego kodowania nazw kolumn, polega na tym, że nazwy kolumn można konfigurować przez użytkownika.
źródło
Odpowiedzi:
Wypróbuj następujący kod:
Zwraca instrukcję SELECT:
SELECT CONVERT(INT, Col1) AS [AccountID],CONVERT(VARCHAR(50), Col2) AS [AccountName],CONVERT(DATE, Col3) AS [AccountOpenDate] FROM #Data WHERE [Type] = 'Account'
źródło
Brzmi to najlepiej w przypadku wyświetlacza front-end. Zapytanie 1 odciągnęłoby twoje dane, Zapytanie 2 odciągnęłoby nazwy kolumn i kodu, kiedy budujesz jakąkolwiek strukturę, której używasz do wyświetlania, ustawiasz nagłówki z drugiego zapytania.
Chociaż czysta metoda SQL może być możliwa, będzie to dynamiczny SQL, a utrzymanie kodu byłoby koszmarem.
Również prawdopodobnie szukasz,
sp_executesql
a nie tylko to,EXECUTE N'Query String'
że może to rozwiązać problem polecenia zakończony powodzeniem.źródło