SELECT
Instrukcja jest prawdopodobnie najczęściej używaną instrukcją w SQL Server. W większości przypadków instrukcja ta jest uruchamiana w widoku lub bezpośrednio w tabeli w celu pobrania wierszy danych tabelarycznych.
Ale widoki i tabele nie są jedynymi obiektami, które możesz uruchomić SELECT
oświadczenie w sprawie. SELECT
Instrukcja może być również używana w innych obiektach, takich jak funkcje zestawu wierszy, OPENXML i funkcje zdefiniowane przez użytkownika.
Ten artykuł zawiera przykład wybierania danych za pomocą funkcji z wartościami w tabeli.
Przykład 1 – Funkcja podstawowa
Oto szybka funkcja, która wybiera podstawowe dane z tabeli za pomocą wbudowanej funkcji o wartościach w tabeli.
SELECT * FROM udf_Cats_ITVF();
Wynik:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 1 | Garfield | 9871237654 | | 2 | Felix | 8871237651 | | 3 | Tom | 7871237652 | | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Funkcja wygląda tak:
CREATE FUNCTION dbo.udf_Cats_ITVF() RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats ); GO
Ta funkcja po prostu wybiera wszystkie wiersze z tabeli. Żadne argumenty nie są wymagane.
Jeśli chcesz wybrać konkretnego kota, musisz dodać WHERE
klauzula.
SELECT * FROM udf_Cats_ITVF() WHERE CatName = 'Fetch';
Wynik:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Teraz muszę przyznać, że ta funkcja jest trochę zbędna, ponieważ mogliśmy po prostu wybrać dane bezpośrednio z tabeli. Albo mogliśmy stworzyć widok, aby wykonać tę pracę. Jednak funkcje zdefiniowane przez użytkownika mają tę zaletę, że tabele i widoki nie mają:parametrów.
Przykład 2 – funkcja z parametrami
Jedną z zalet funkcji wycenianych w tabeli jest to, że obsługują one parametry. W tym miejscu funkcja staje się nieco bardziej użyteczna. Niektórzy odnoszą się do funkcji wartości w tabeli jako „widoków parametrycznych”, ponieważ zachowują się one jak widok, ale z dodatkową funkcjonalnością zezwalania na parametry.
Moglibyśmy więc stworzyć odmianę poprzedniej funkcji, aby zaakceptować argument dla imienia kota.
SELECT * FROM udf_CatsByName_ITVF('Fetch');
Wynik:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Nowa funkcja wygląda tak:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Przykład 3 – Połączenia
Funkcje wyceniane w tabeli mogą być zawarte w sprzężeniach.
Tutaj wybieram wszystkie kolumny z funkcji wartości w tabeli, która zwraca wszystkie albumy danego artysty:
SELECT * FROM ufn_AlbumsByArtist(1);
Wynik:
+------------+-------------------------+---------+ | ArtistId | AlbumName | Genre | |------------+-------------------------+---------| | 1 | Powerslave | Rock | | 1 | Somewhere in Time | Rock | | 1 | Piece of Mind | Rock | | 1 | Killers | Rock | | 1 | No Prayer for the Dying | Rock | +------------+-------------------------+---------+
Jedynym problemem z tą funkcją jest to, że nie zwraca ona nazwy wykonawcy. Jeśli chcę nazwisko wykonawcy, muszę połączyć je z tabelą zawierającą te dane. W tym przypadku tabela zawierająca nazwisko wykonawcy nazywa się Artists
, więc mogę zmodyfikować moje zapytanie w następujący sposób:
SELECT ar.ArtistName, aba.AlbumName, aba.Genre FROM ufn_AlbumsByArtist(1) aba INNER JOIN Artists ar ON aba.ArtistId = ar.ArtistId;
Wynik:
+--------------+-------------------------+---------+ | ArtistName | AlbumName | Genre | |--------------+-------------------------+---------| | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | +--------------+-------------------------+---------+