87. Spotkanie PLSSUG – dodatek o FILESTREAM

7 maja 2015 roku na 87. spotkaniu warszawskiej grupy PLSSUG prowadziłem sesję nt. FILESTREAM w SQL Server. Zostały dwa pytania, na które chciałbym uzupełnić odpowiedź.

1. Czy można utworzyć grupę plików zawierającą FILESTREAM na zasobie sieciowym?

W pierwszej chwili odpowiedziałem, że nie – z tego co wiem, nie można założyć grupy FILESTREAM na zasobie sieciowym – musi być bezpośrednio na dysku. Swoją wiedzę opierałem na dokumencie Paula Randalla nt. FILESTREAM oraz jego wpisie na blogu, który ponownie mówi o tym, że reguły tworzenia grup plików pod FILESTREAM maja takie same zasady, jak tworzenie plików baz danych i logów. Przed sesją nie sprawdziłem tego dokładnie, ale kiedy na sesji padło pytanie przypomniałem sobie, że informacje od Paula Randalla pochodzą z 2008 i 2010 roku, a SQL Server 2012 wprowadził możliwość tworzenia plików na zasobach sieciowych. Ale o tym, że jest adnotacja „Filestream is currently not supported on an SMB file share.” już nie pamiętałem – stąd moje zawahanie i stwierdzenie, że się nie da, ale jeszcze sprawdzę.
Czytaj dalej

SQL Server: Jak szybko sprawdzić rozmiary tabel w bazie

CREATE TABLE #rozmiary (
	_name varchar(128),
	_rows int,
	_reserved varchar(18),
	_data varchar(18),
	_index_size varchar(18),
	_unused varchar(18)
)

INSERT INTO #rozmiary exec sp_MSforeachtable "sp_spaceused [?]"

SELECT * FROM #rozmiary ORDER BY _rows DESC

DROP TABLE #rozmiary

Wada – nie podaje przestrzeni nazw w kolumnie _name. Dokumentacja zaleca w takich wypadkach stosowanie sys.dm_db_partition_stats lub sys.dm_db_index_physical_stats

Case sensitive REPLACE

Kolejne pytanie: jak wykonać REPLACE w SQL Serverze, ale tak żeby zamieniało będąc wrażliwym na wielkość znaków? Czyli coś w stylu:

REPLACE(kolumna, ‚mars’, ‚Snickers’) – źle
REPLACE(kolumna, ‚Mars’, ‚Snickers’) – dobrze

Funkcja REPLACE dokonuje porównania stringów na podstawie parametru COLLATION bazy danych lub kolumny. Aby zmienić to zachowanie najprościej lokalnie wykorzystać COLLATE.
Czytaj dalej

Dopełnianie zerami

Kolejne zadanie bojowe: do liczby z jakiejś kolumny dodać np. zera – ale albo na początku, albo na końcu. I żeby jeszcze była stała długość tak powstałej wartości, czyli np. dla liczby 12 dopełniać trzema zerami, ale dla 142 już tylko dwoma. Poniżej przykład dla zadanego ciągu 10 znaków.

Na szybko można rozwiązać to tak:
– dla dopełnienia ciągu z lewej strony
SELECT RIGHT(‚0000000000’+ CAST(kolumna AS VARCHAR(10)), 10)

Doklejamy na początek 10 zer, po czym bierzemy dziesięć ostatnich znaków.

– dla dopełnienia ciągu z prawej strony
SELECT LEFT(CAST(kolumna AS VARCHAR(10)) + ‚0000000000’, 10)

Tak samo – doklejamy 10 zer, tyle że na końcu i bierzemy pierwsze dziesięć znaków.

Znajdź ostatnie n znaków

Żona zadała mi pytanie w związku z rozwijanym w firmie systemem pisanym w C# i opartym o SQL Server: jakimi sposobami z ciągu znaków np. „kkk/384/d3/a/332” można wyciągnąć liczby po ostatnim znaku „/”?

Do głowy przychodzą mi dwa rozwiązania:

  • wyszukać ostatnie pojawienie się znaku „/” i odpowiednio wyciąć string
  • zastosować wyrażenie regularne do znalezienia cyfr na końcu ciągu

W przypadku SQL Servera nie ma wbudowanych bibliotek do wyrażeń regularnych. Można napisać własne funkcje wykorzystujące SQLCLR (dla wersji 2005 i 2008) lub OLE (dla wersji 2000) lub skorzystać z istniejących zewnętrznych bibliotek dll (np. xp_pcre). W tym konkretnym przypadku można jednak osiągnąć zamierzony wynik żonglując standardowymi funkcjami T-SQL. Czytaj dalej

osql i polskie znaki

W poprzednim tekście napisałem, że w przypadku SQL Servera 2000 do automatyzacji zadań możemy wykorzystać osql. Niestety może on mieć problem w przypadku gdy chcemy załadować plik zawierający polskie znaki. Na szybko można wykorzystać dwa rozwiązania:

  • zamiana strony kodowej ładowanego pliku,
  • lub uruchomienie Query Analyzera z poziomu konsoli Czytaj dalej