Ukryte funkcje programu SQL Server


215

Jakie są ukryte funkcje programu SQL Server ?

Na przykład nieudokumentowane procedury składowane w systemie, sztuczki, aby robić rzeczy, które są bardzo przydatne, ale niewystarczająco udokumentowane?


Odpowiedzi

Dziękujemy wszystkim za wszystkie wspaniałe odpowiedzi!

Procedury przechowywane

  • sp_msforeachtable: Uruchamia polecenie za pomocą „?” zastąpione nazwą każdej tabeli (wer. 6.5 i nowsze)
  • sp_msforeachdb: Uruchamia polecenie za pomocą „?” zastąpione każdą nazwą bazy danych (wersja 7 i nowsze)
  • sp_who2: podobnie jak sp_who, ale z dużo większą ilością informacji na temat rozwiązywania problemów z blokami ( wersja 7 i nowsze )
  • sp_helptext: Jeśli chcesz kod procedury przechowywanej, zobacz & UDF
  • sp_tables: zwraca listę wszystkich tabel i widoków bazy danych w zakresie.
  • sp_stored_procedures: zwraca listę wszystkich procedur przechowywanych
  • xp_sscanf: Odczytuje dane z łańcucha do lokalizacji argumentów określonych przez każdy argument formatu.
  • xp_fixeddrives:: Znajdź dysk twardy z największą ilością wolnego miejsca
  • sp_help: Jeśli chcesz poznać strukturę tabeli, indeksy i ograniczenia tabeli. Również widoki i UDF. Skrót to Alt + F1

Fragmenty

  • Zwracanie wierszy w losowej kolejności
  • Wszystkie obiekty użytkownika bazy danych według daty ostatniej modyfikacji
  • Tylko data powrotu
  • Znajdź rekordy, których data przypada gdzieś w bieżącym tygodniu.
  • Znajdź rekordy, które miały miejsce w zeszłym tygodniu.
  • Zwraca datę początku bieżącego tygodnia.
  • Zwraca datę na początku ubiegłego tygodnia.
  • Zobacz tekst procedury wdrożonej na serwerze
  • Usuń wszystkie połączenia z bazą danych
  • Tabela suma kontrolna
  • Suma kontrolna wiersza
  • Upuść wszystkie procedury w bazie danych
  • Ponownie mapuj identyfikatory logowania poprawnie po przywróceniu
  • Wywołaj procedury przechowywane z instrukcji INSERT
  • Znajdź procedury według słowa kluczowego
  • Upuść wszystkie procedury w bazie danych
  • Zapytaj programowo o dziennik transakcji dla bazy danych.

Funkcje

  • HashBytes ()
  • EncryptByKey
  • Polecenie PIVOT

Misc

  • Dodatki parametrów połączenia
  • TableDiff.exe
  • Wyzwalacze zdarzeń logowania (nowość w dodatku Service Pack 2)
  • Zwiększanie wydajności dzięki utrwalonym kolumnom obliczeniowym (PCC).
  • Ustawienie DEFAULT_SCHEMA w sys.database_principles
  • Wymuszona parametryzacja
  • Vardecimal Storage Format
  • Wyszukanie najpopularniejszych zapytań w kilka sekund
  • Skalowalne współużytkowane bazy danych
  • Filtr tabeli / procedury składowanej w SQL Management Studio
  • Flagi śledzenia
  • Liczba po GOpowtórzeniu partii
  • Bezpieczeństwo za pomocą schematów
  • Szyfrowanie przy użyciu wbudowanych funkcji szyfrowania, widoków i tabel podstawowych z wyzwalaczami

4
Jeśli jest znany, dobrze byłoby dołączyć odpowiednie wersje do każdej odpowiedzi. (2000 i więcej, tylko 2005, 2000 itd.)
mc

W tym pytaniu jest wiele dobroci. Nie usuwaj go! :-)
Sklivvz

Odpowiedzi:


91

W Management Studio można wstawić liczbę za znacznikiem końca partii GO, aby powtarzać tę partię tyle razy:

PRINT 'X'
GO 10

Wydrukuje „X” 10 razy. Może to uchronić Cię przed żmudnym kopiowaniem / wklejaniem podczas wykonywania powtarzających się czynności.


70

Wielu programistów SQL Server nadal nie wie o klauzuli OUTPUT (SQL Server 2005 i nowsze) w instrukcjach DELETE, INSERT i UPDATE.

Bardzo przydatna może być wiedza, które wiersze zostały WSTAWIONE, UPDATEd lub DELETEd, a klauzula OUTPUT pozwala to zrobić bardzo łatwo - umożliwia dostęp do wywoływanych tabel „wirtualnych” insertedi deleted(jak w wyzwalaczach):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

Jeśli wstawiasz wartości do tabeli, która ma pole klucza podstawowego INT IDENTITY, z klauzulą ​​OUTPUT, możesz od razu wstawić nowy identyfikator:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

A jeśli aktualizujesz, może być bardzo przydatne wiedzieć, co się zmieniło - w tym przypadku insertedreprezentuje nowe wartości (po UPDATE), podczas gdy deletedodnosi się do starych wartości przed UPDATE:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

Jeśli zostanie zwróconych wiele informacji, dane wyjściowe OUTPUT można również przekierować do tabeli tymczasowej lub zmiennej tabeli ( OUTPUT INTO @myInfoTable).

Niezwykle przydatne - i bardzo mało znane!

Marc


52

sp_msforeachtable: Uruchamia polecenie za pomocą „?” zastąpione nazwą każdej tabeli. na przykład

exec sp_msforeachtable "dbcc dbreindex('?')"

Możesz wydać do 3 poleceń dla każdej tabeli

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

Również, sp_MSforeachdb


2
Nazwę tabeli można uzyskać w zapytaniu, używając pojedynczych cudzysłowów wokół znaku zapytania. sp_msforeachtable "wybierz liczbę (*), '?' jak z tabenm? ”
Jody

51

Dodatki parametrów połączenia:

MultipleActiveResultSets = true;

To sprawia, że ​​ADO.Net 2.0 i nowsze wersje odczytują wiele zestawów wyników tylko do przodu, tylko do odczytu na jednym połączeniu z bazą danych, co może poprawić wydajność, jeśli dużo czytasz. Możesz go włączyć, nawet jeśli robisz różne typy zapytań.

Nazwa aplikacji = MyProgramName

Teraz, gdy chcesz zobaczyć listę aktywnych połączeń poprzez zapytanie do tabeli sysprocesses, nazwa twojego programu pojawi się w kolumnie nazwa_programu zamiast „.Net SqlClient Data Provider”


7
W mojej firmie wymagałem podania nazwy aplikacji. Każda nowa aplikacja musi mieć unikalną nazwę. Ułatwia śledzenie, która aplikacja zablokowała / zepsuła coś.
Neil N,

2
Nazwa aplikacji jest również dostępna jako filtr w profilerze. Bardzo pomaga, jeśli chcesz zobaczyć tylko swoje zapytania, a nie zapytania współpracowników.
Mathias F,

33

TableDiff.exe

  • Narzędzie Różnica tabel pozwala odkrywać i uzgadniać różnice między tabelą źródłową i docelową lub widokiem. Program Tablediff Utility może zgłaszać różnice w schemacie i danych. Najpopularniejszą funkcją tablediff jest fakt, że może on wygenerować skrypt, który można uruchomić w miejscu docelowym, który pogodzi różnice między tabelami.

Połączyć


31

Mniej znana technika TSQL do zwracania wierszy w losowej kolejności:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())

6
Idealne dla małych zestawów wyników. Nie użyłbym tego na stole z więcej niż 10000 rzędami, chyba że masz czas do stracenia
John Sheehan

Użyłem go na stołach znacznie większych i nie było to zbyt wolne.
Mitch Wheat

Jaki jest cel CHECKSUM ()? Możesz zamówić po prostu NEWID ().
Jonas Lincoln,

6
Widziałem nawet przyzwoite wyniki w 100 000 000 (100 mil) wierszach, bez CHECKSUM (). Również muszę zapytać, dlaczego nie po prostu ZAMÓW WEDŁUG NEWID?
Troy DeMonbreun

5
@GateKiller: Cofnąłem twoją edycję, ponieważ suma kontrolna () nie jest błędem; zmniejsza rozmiar kolumny sortowania.
Mitch Wheat

30

W Management Studio możesz szybko uzyskać listę kolumn rozdzielanych przecinkami dla tabeli:

  1. W Eksploratorze obiektów rozwiń węzły pod daną tabelą (aby wyświetlić foldery dla kolumn, kluczy, ograniczeń, wyzwalaczy itp.)
  2. Wskaż folder Kolumny i przeciągnij do zapytania.

Jest to przydatne, gdy nie chcesz używać obrzydliwego formatu zwracanego przez kliknięcie tabeli prawym przyciskiem myszy i wybranie Skryptu tabeli jako ..., a następnie Wstaw do ... Ta sztuczka działa z innymi folderami, ponieważ daje ci rozdzielana przecinkami lista nazw zawartych w folderze.


23

Konstruktory rzędów

Możesz wstawić wiele wierszy danych za pomocą jednej instrukcji insert.

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')

Głosowałem za tym, ale wypróbowałem go w MSSQL 2005 i to nie działa. Tylko 2008?
richardtallent

11
Tak, to nowa funkcja z 2008 roku.
Rob Boek,

2
To była funkcja, której mi brakowało, kiedy przyszedłem z DB2 do SQL Server. W programie DB2 nastąpiła znaczna poprawa prędkości podczas korzystania z tego zamiast indywidualnych instrukcji wstawiania
Nathan Koop

22

Jeśli chcesz poznać strukturę tabeli, indeksy i ograniczenia:

sp_help 'TableName'

Połącz tę wskazówkę z klawiszem skrótu! Najpierw zaznacz tablename, a następnie naciśnij ALT + F1
Michael J Swart


20

Ustalanie najpopularniejszych zapytań

  • Za pomocą sys.dm_exec_query_stats możesz znaleźć wiele kombinacji analiz zapytań za pomocą jednego zapytania.

Link do Commnada

select * from sys.dm_exec_query_stats 
order by execution_count desc


16

Z WYJĄTKIEM I INTERSEKTEM

Zamiast pisać skomplikowane sprzężenia i podzapytania, te dwa słowa kluczowe są znacznie bardziej eleganckim skrótem i czytelnym sposobem wyrażenia intencji zapytania podczas porównywania dwóch wyników zapytania. Nowe od SQL Server 2005, silnie uzupełniają UNION, który istnieje już w języku TSQL od lat.

Pojęcia EXCEPT, INTERSECT i UNION są fundamentalne w teorii mnogości, która służy jako podstawa i podstawa modelowania relacyjnego stosowanego we wszystkich współczesnych RDBMS. Teraz wyniki typu diagramu Venna mogą być generowane bardziej intuicyjnie i dość łatwo przy użyciu TSQL.


16

Wiem, że nie jest dokładnie ukryty, ale niewiele osób wie o poleceniu PIVOT . Byłem w stanie zmienić procedurę przechowywaną, która używała kursorów, i zajęło mi 2 minuty, aby uruchomić szybki 6-sekundowy fragment kodu, który był jedną dziesiątą liczby wierszy!


16

przydatne podczas przywracania bazy danych do celów testowania lub cokolwiek innego. Ponownie zmapuj identyfikator logowania poprawnie:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'

Ten proces nie działał wcześniej i musiałem zmienić własność obiektów na użytkownika tymczasowego, upuścić pierwotnego użytkownika, ponownie dodać oryginał i przypisać własność z powrotem. Ugh ...
StingyJack,

15

Usuń wszystkie połączenia z bazą danych:

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

Czy istnieje parametr z jedną linią lub parametr bazy danych upuszczania, który to dla mnie robi? Zauważam, że jeśli spróbujesz „usunąć bazę danych” za pomocą interfejsu użytkownika, pojawi się pole wyboru „zamknij istniejące połączenia”, co oznacza, że ​​jest to parametr boolowski.
DevinB

1
Właściwie właśnie znalazłem rozwiązanie dwuwierszowe. ALTER DATABASE [@ DATABASE_NAME @] SET READ_ONLY Wycofywanie z natychmiastowym --this rozłącza wszystkich użytkowników ALTER DATABASE [@ DATABASE_NAME @] SET READ_WRITE WITH ROLLBACK NATYCHMIASTOWEJ DROP DATABASE [@ DATABASE_NAME @]
DevinB

1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEzapobiegnie również pojawianiu się nowych połączeń.
ErikE

15

Tabela suma kontrolna

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

Suma kontrolna wiersza

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value

2
Pozwalają one wygenerować sumę kontrolną dla wszystkich danych w tabeli. Jest to prosty i szybki sposób sprawdzenia, czy dwa wiersze lub dwie tabele są takie same.
GateKiller,

15

Nie jestem pewien, czy jest to ukryta funkcja, czy nie, ale natknąłem się na to i przydało mi się to przy wielu okazjach. Można konkatować zestaw pól w pojedynczej instrukcji select, zamiast używać kursora i pętli w instrukcji select.

Przykład:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

Wyniki:

Acme, Microsoft, Apple,

2
możesz także użyć COALESCE (), aby zrobić to samo bez konieczności inicjowania zmiennej. WYBIERZ @nvcConcatonated = COALESCE (@nvcConcatonated + ',', '') + CAST (C.CompanyName jako VARCHAR (255)) OD ...
Christopher Klein

Działa to również w instrukcji aktualizacji. Czasami przydatne do robienia rzeczy, takich jak łączenie listy zaktualizowanych identyfikatorów.
EBarr

14

Jeśli chcesz kod procedury składowanej, możesz:

sp_helptext 'ProcedureName'

(nie jestem pewien, czy jest to funkcja ukryta, ale używam jej cały czas)


Nie wiem dlaczego, ale wyjście sp_helptext jest nieco głupie na zbyt długich liniach w oryginale. Przy skryptowaniu Sprocs tak się nie dzieje, więc może istnieje inny, bardziej niezawodny mechanizm eksportu? sp_helptext „MyView” również jest użyteczny.
Kristen

Nie jestem pewny co masz na myśli. Dla mnie kod SP jest generowany w tym samym formacie, w którym zapisałem go w oryginalnym pliku (ze wszystkimi CR, itp.)
Eduardo Molteni,

Nie pamiętam dokładnych szczegółów, ale ma to związek ze sposobem przechowywania tekstu - wierzę, że chodzi o rozmiar strony. Dane wyjściowe są w większości poprawne, ale co jakiś czas pojawia się dodatkowy podział wiersza.
RolandTumble

13

Sztuczka z procedury składowanej polega na tym, że można ją wywoływać z instrukcji INSERT. Uznałem to za bardzo przydatne podczas pracy z bazą danych SQL Server.

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto

1
Niestety nie można go używać z @TableVariable
Kristen

Ból związany z tą bardzo przydatną techniką polega na tym, że w przeciwieństwie do większości # tabel, musisz w pełni zdefiniować wszystkie kolumny. Leniwym sposobem na to jest utworzenie #table wewnątrz proc, do którego dzwonisz na samym końcu, a następnie sp_help w tempdb, kopiowanie i wklejanie, usuwanie kodu z proc. Gotowe
czosnek Adolf

12

W SQL Server 2005/2008, aby wyświetlić numery wierszy w wyniku zapytania SELECT:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BY jest klauzulą ​​obowiązkową. Klauzula OVER () nakazuje silnikowi SQL sortowanie danych w określonej kolumnie (w tym przypadku OrderId) i przypisywanie liczb zgodnie z wynikami sortowania.


nie byłoby prostsze, gdyby użyli syntaktycznego suger w silniku sql do parsowania słowa składniowego jako „RowNumberInTable”
brak

1
+1 dla funkcji okna. Możesz wykonywać czynności NAD podzbiorem rekordów, używając OVER (PARTITION BY ...) msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
Matt Stephenson

10

Przydatne do analizowania argumentów procedury składowanej: xp_sscanf

Odczytuje dane z łańcucha do lokalizacji argumentów określonych przez każdy argument formatu.

W poniższym przykładzie użyto xp_sscanf do wyodrębnienia dwóch wartości z ciągu źródłowego na podstawie ich pozycji w formacie ciągu źródłowego.

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

Oto zestaw wyników.

-------------------- -------------------- 
products10.tmp        random

4
Muszę mieć głupi moment (nie, naprawdę). Czy możesz mi powiedzieć, gdzie możemy to wykorzystać?
Raj Więcej

9

Tylko data powrotu

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

lub

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))

Wersja skrócona - WYBIERZ CAST (FLOOR (CAST (@DateTime AS FLOAT)) JAKO DATETIME)
Meff

O tak. Zasady CASTFLOORCAST.
StingyJack,

Nie mogę znaleźć odniesienia do niego, ale wydaje mi się, że pamiętam testy, które sugerowały, że SELECT DateAdd (Day, 0, DateDiff (Day, 0, @DateTime)) był szybszy. Tak czy inaczej szczęśliwy!
Kristen

Znaleziono ten sqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617, ale nie zawiera on metody CAST / FLOOR. Nieformalny test na średnim zestawie rekordów sugeruje, że DATEADD może być o około 7% szybszy niż CAST / FLOOR - nie wystarczy martwić się w większości sytuacji
Kristen

Dodałem jednak inną metodę; moje szybkie testy wykazały, że metoda odlanej podłogi jest o 800 nanosekund szybsza. Więc nic w tym naprawdę.
GateKiller

9

dm_db_index_usage_stats

Dzięki temu możesz wiedzieć, czy dane w tabeli zostały ostatnio zaktualizowane, nawet jeśli nie masz kolumny DateUpdated w tabeli.

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

Kod z: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

Informacje, do których odwołuje się: SQL Server - Jaka jest data / godzina ostatniego wstawionego wiersza tabeli?

Dostępne w SQL 2005 i późniejszych


7

Oto kilka funkcji, które uważam za przydatne, ale wiele osób nie wie o nich:

sp_tables

Zwraca listę obiektów, które można przeszukiwać w bieżącym środowisku. Oznacza to każdy obiekt, który może pojawić się w klauzuli FROM, z wyjątkiem obiektów synonimicznych.

Połączyć

sp_stored_procedures

Zwraca listę procedur przechowywanych w bieżącym środowisku.

Połączyć


7

Znajdź rekordy, których data przypada gdzieś w bieżącym tygodniu.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

Znajdź rekordy, które miały miejsce w zeszłym tygodniu.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

Zwraca datę początku bieżącego tygodnia.

select dateadd( week, datediff( week, 0, getdate() ), 0 )

Zwraca datę na początku ubiegłego tygodnia.

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

Dobra, ale indeks na TransDate nie byłby używany. Wolę pisać
vaso

gdzie TransDate> = konwersja (data / godzina, floor (konwersja (liczba zmiennoprzecinkowa, dateadd (dzień, -datapart (dzień tygodnia, @ data) +1, @ data)))) i TransDate> = konwersja (data / godzina, floor (konwersja (liczba zmienna, dateadd (dzień, część 7-dniowa (dzień tygodnia, @ data) +1, @ data))))
vaso

korekta: gdzie TransDate> = konwersja (data / godzina, floor (konwersja (liczba zmiennoprzecinkowa, dateadd (dzień, -datapart (dzień tygodnia, @ data) +1, @ data)))) i TransDate <konwersja (data / godzina, floor (konwersja (liczba zmiennoprzecinkowa, dateadd (dzień, część 7-dniowa (dzień tygodnia, @ data) +1, @ data))))
vaso

7

Nie tyle ukryta funkcja, ale konfigurowanie mapowania klawiszy w Management Studio w Tools \ Options \ Keyboard: Alt + F1 jest domyślnie ustawiony na sp_help „zaznaczony tekst”, ale nie mogę żyć bez dodania Ctrl + F1 dla sp_helptext „zaznaczonego tekstu”


Używam również do konfigurowania polecenia USE, do poruszania się po
bazach danych

7

Utrwalone-obliczone-kolumny

  • Kolumny obliczane mogą pomóc w przesunięciu kosztu obliczeniowego środowiska wykonawczego do fazy modyfikacji danych. Obliczona kolumna jest przechowywana wraz z resztą wiersza i jest przezroczyście wykorzystywana, gdy wyrażenie w kolumnach obliczeniowych i zapytanie są zgodne. Możesz także budować indeksy na PCC, aby przyspieszyć filtrację i skanowanie zasięgu wyrażenia.

Połączyć


7

Są chwile, kiedy nie ma odpowiedniej kolumny do sortowania, lub po prostu chcesz domyślną kolejność sortowania w tabeli i chcesz wyliczyć każdy wiersz. Aby to zrobić, możesz wpisać „(wybierz 1)” w klauzuli „sortuj według”, a otrzymasz to, co chcesz. Schludnie, co?

select row_number() over (order by (select 1)), * from dbo.Table as t

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.