Piotr Szczepanik – programowanie (.Net, C#, SQL), administracja, IT

blog IT: programowanie, administracja
Chcemy zmienić COLLATION dla naszej bazy danych, ale SQL Server zwraca nam komunikat: The database could not be exclusively locked to perform the operation.

Możemy ominąć ten problem zmieniając przed wykonaniem operacji zmiany COLLATION przestawiamy tryb pracy bazy danych na single user, a po wykonaniu operacji z powrotem na multi user.

 T-SQL |  kopiuj kod |? 
1
ALTER DATABASE [nazwa bazy] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
2
ALTER DATABASE [nazwa bazy] COLLATE [nazwa COLLATION]
3
ALTER DATABASE [nazwa bazy] SET MULTI_USER
Większość osób posługujących się SQL’em wie do czego służy UNION, mało tego często zdarza się, że go używa. :)

Jednak jak pokazuje doświadczenie, nie każdy wie jaka różnica jest pomiędzy UNION, a UNION ALL. W rezultacie przy pisaniu zapytania stosuje UNION, chociażby z racji tego, iż jest krótsze :) .

W skrócie UNION ALL łączy wszystkie rekordy z zapytań, natomiast UNION dokonuje filtracji i odrzuca duplikujące się rekordy (DISTINCT).

W przypadku zbioru danych, w którym nie występują duplikaty dane wynikowe będą takie same, jednak samo obciążenie wywołane zapytaniem jest inne, na niekorzyść UNION.

Co z tego wynika? Jeżeli jesteśmy pewni, że dane znajdujące się w łączonych przez nas zapytaniach nie posiadają duplikatów / bądź też nie przeszkadza nam obecność duplikatów zawsze stosujmy UNION ALL.
Jak pobrać losowy rekord z tablicy w bazie danych ?

Np. tak:

 T-SQL |  kopiuj kod |? 
1
SELECT TOP (1) imie FROM obywatele
2
ORDER BY NEWID()
3

Przykład dla bazy danych MySql:
 MySQL |  kopiuj kod |? 
1
SELECT imie FROM obywatele
2
ORDER BY RAND()
3
LIMIT 1
4

Zapytanie w MS Access:
 SQL |  kopiuj kod |? 
1
SELECT TOP (1) imie
2
FROM obywatele
3
ORDER BY Rnd(kolumna_id)
Chcemy wstawić tekst zawierający znaki końca wiersza do pola typu varchar za pomocą zapytania T-SQL ?

Możemy to zrobić tak:

 T-SQL |  kopiuj kod |? 
1
INSERT INTO [dbo].[Teksty] ([Tresc]) 
2
VALUES ('Pierwsza linia' + CHAR(13) + CHAR(10) +
3
'druga linia' + CHAR(13) + CHAR(10) + 'trzecia linia.')

albo po prostu:

 T-SQL |  kopiuj kod |? 
1
INSERT INTO [dbo].[Teksty] ([Tresc]) 
2
VALUES (
3
'Pierwsza linia
4
druga linia
5
trzecia linia.')