wtorek, 23 listopada 2010

CTE i odwrócenie STRINGa

Dość często słyszę, że na rozmowach kwalifikacyjnych na stanowisko programisty dostaje się zadanie p.t. odwrócenie STRINGa. Oczywiście nie chodzi tu o użycie istniejącej funkcji, ale o napisanie swojej. I tu w ramach fascynacji CTE pomyślałem, że może zrobić to w T-SQL ale za pomocą pojedynczego zapytania. No i wyszło mi coś takiego :

DECLARE @STRING AS VARCHAR(8000);
SET @STRING = '123456789';

WITH CTE
AS 
(
    SELECT CAST(RIGHT(@STRING, 1) AS VARCHAR(8000)) AS REVERSE_STRING
        , DATALENGTH(@STRING) - 1 AS I
    
    UNION ALL
    
    SELECT REVERSE_STRING + RIGHT(LEFT(@STRING, I), 1)
        , I - 1
    FROM CTE
    WHERE I > 0
)
SELECT REVERSE_STRING
FROM CTE
WHERE I = 0
OPTION(MAXRECURSION 8000);

GO LOOP

Prawie nigdy nie rozdzielam zapytań w SSMS słówkiem GO. Jakoś nie jest to mi do niczego potrzebne. Dziś jednak odkryłem, że GO mam fajną właściwość. Jako parametr przyjmuje ilość wywołań danej sekwencji zapytań. Np. coś takiego :
SELECT 'WYŚWIETL MNIE 5 RAZY'
GO 5

SELECT 'A MNIE 3'
GO 3
... daje takie o to wyniki :


Do czego tego użyć ? Może proste wstawienie kliku testowych rekordów do tabeli, bez pisania np. pętli WHILE ?

poniedziałek, 22 listopada 2010

T-SQL CHALLENGES

Jeżeli chcielibyście zmierzyć swoje siły w zadaniach praktycznych z T-SQLa to zapraszam na stronki :
  1. dla początkujących : http://beyondrelational.com/blogs/tcb/default.aspx
  2. dla bardziej zaawansowanych : http://beyondrelational.com/tc/
Od jakiegoś czasu biorę w nich udział i sprawia mi to wielką frajdę.