Nowość w SQL Server 2012 – WITH RESULT SETS, czyli rozszerzenie polecenia exec

                W idealnym świecie mamy wystarczająco wiele czasu na projektowanie najbardziej optymalnych algorytmów a każda kluczowa zmiana jest dyskutowana w szerokim gronie wszystkich zainteresowanych i wiąże się z  refaktoringiem już istniejących rozwiązań.

                 Ok, to tyle idealnego świata. W praktyce większość rzeczy jest na wczoraj, zmiany robione są możliwie szybko a refaktoring to coś, za co nie wiadomo czy i kto ma zapłacić. Często więc stajemy przed faktem że jest napisana procedura która nam by się przydała, ale jest napisana pod kogoś i żeby dla nas była użyteczna potrzebujemy kilka zmian.

W tym momencie może (choć wcale nie musi – o czym trochę później) nam przyjść z pomocą klauzula WITH RESULT SETS dla polecenia ECEC. Spójrzmy na przykład:

--mamy procedurę napisaną przez kogoś i dla kogoś
CREATE PROCEDURE mg.test_execute
       @customerID int
AS
BEGIN
  SELECT   CAST(CustomerID AS bigint)       AS id,
             CAST(rowguid AS    VARCHAR(MAX)) AS guid
  FROM     Sales.Customer
  WHERE    CustomerID > @customerID
  ORDER BY CustomerID
  OFFSET 10 ROWS
  FETCH NEXT 10 ROWS ONLY
END
GO
--z nieznanych nam przyczyn CustomerID 
--został zrzutowany na biginta, 
--natomiast rowguid na varchar(max).

-- jako wynik polecenia
EXEC mg.test_execute 5
GO
-- otrzymujemy:

Przyjmijmy teraz że nasza aplikacja, która mogłaby korzystać z tej procedury oczekuje że wszystkie kolumny będą typu varchar o zdefiniowanej długości. Z pomocą przychodzi nam klauzula WITH RESULT SETS która pozwala zmienić wynikowe typy kolumn:

EXEC mg.test_execute 5
WITH RESULT SETS
(
(
       id varchar(10),
       guid varchar(32)
)
)
GO

Dzięki temu poleceniu kolumna id została zrzutowana do varchar(10) natomiast guid do varchar(32).

Ok, ale chcielibyśmy aby kolumny miały nazwy, które można zaprezentować w aplikacji. Znów z pomocą przychodzi klauzula WITH RESULT SETS która pozwala zmienić wynikowe nazwy  kolumn (umożliwia nadanie aliasów kolumn):

EXEC mg.test_execute 5
WITH RESULT SETS
(
(
       [numer klienta] varchar(10),
       [identyfikator] varchar(32)
)
)
GO

W wyniku otrzymujemy:

Ok, a czego nie można zrobić używając klauzuli WITH RESULT SETS:
- nie można zmodyfikować liczby kolumn (w stosunku do liczby zwracanej przez procedurę)
- nie można robić operacji na danych (jedynie rzutowanie typów zmiennych)

Jednak pomimo tych ograniczeń wydaje się, że klauzula znajdzie swoje miejsce w wielu projektach.

pozdrawiam,

Podziel się na:
  • Google Bookmarks
  • RSS
  • Dodaj do ulubionych
  • email
  • Facebook
  • Twitter
  • Blogger.com
  • LinkedIn
  • Gadu-Gadu Live