Versteckte Funktionen von SQL Server

215

Was sind einige versteckte Funktionen von SQL Server ?

Zum Beispiel undokumentierte gespeicherte Systemprozeduren, Tricks, um Dinge zu tun, die sehr nützlich, aber nicht ausreichend dokumentiert sind?


Antworten

Vielen Dank an alle für die tollen Antworten!

Gespeicherte Prozeduren

  • sp_msforeachtable: Führt einen Befehl mit '?' durch jeden Tabellennamen ersetzt (v6.5 und höher)
  • sp_msforeachdb: Führt einen Befehl mit '?' durch jeden Datenbanknamen ersetzt (v7 und höher)
  • sp_who2: genau wie sp_who, aber mit viel mehr Informationen zur Fehlerbehebung bei Blöcken (v7 und höher)
  • sp_helptext: Wenn Sie den Code einer gespeicherten Prozedur möchten, zeigen Sie & UDF an
  • sp_tables: Gibt eine Liste aller Tabellen und Ansichten der Datenbank im Gültigkeitsbereich zurück.
  • sp_stored_procedures: Gibt eine Liste aller gespeicherten Prozeduren zurück
  • xp_sscanf: Liest Daten aus der Zeichenfolge in die Argumentpositionen, die von jedem Formatargument angegeben werden.
  • xp_fixeddrives :: Suchen Sie das Festplattenlaufwerk mit dem größten freien Speicherplatz
  • sp_help: Wenn Sie die Tabellenstruktur, Indizes und Einschränkungen einer Tabelle kennen möchten. Auch Ansichten und UDFs. Die Verknüpfung ist Alt + F1

Schnipsel

  • Zeilen in zufälliger Reihenfolge zurückgeben
  • Alle Datenbankbenutzerobjekte nach Datum der letzten Änderung
  • Nur Rückgabedatum
  • Suchen Sie nach Datensätzen, deren Datum irgendwo in der aktuellen Woche liegt.
  • Suchen Sie nach Aufzeichnungen, welches Datum letzte Woche aufgetreten ist.
  • Gibt das Datum für den Beginn der aktuellen Woche zurück.
  • Gibt das Datum für den Anfang der letzten Woche zurück.
  • Siehe den Text einer Prozedur, die auf einem Server bereitgestellt wurde
  • Trennen Sie alle Verbindungen zur Datenbank
  • Tischprüfsumme
  • Reihenprüfsumme
  • Löschen Sie alle Prozeduren in einer Datenbank
  • Ordnen Sie die Anmelde-IDs nach der Wiederherstellung korrekt zu
  • Rufen Sie gespeicherte Prozeduren aus einer INSERT-Anweisung auf
  • Verfahren nach Schlüsselwort suchen
  • Löschen Sie alle Prozeduren in einer Datenbank
  • Fragen Sie das Transaktionsprotokoll für eine Datenbank programmgesteuert ab.

Funktionen

  • HashBytes ()
  • EncryptByKey
  • PIVOT-Befehl

Sonstiges

  • Extras für Verbindungszeichenfolgen
  • TableDiff.exe
  • Trigger für Anmeldeereignisse (neu in Service Pack 2)
  • Leistungssteigerung mit persistierten berechneten Spalten (pcc).
  • DEFAULT_SCHEMA-Einstellung in sys.database_principles
  • Erzwungene Parametrisierung
  • Vardezimales Speicherformat
  • In Sekundenschnelle die beliebtesten Abfragen herausfinden
  • Skalierbare gemeinsam genutzte Datenbanken
  • Filterfunktion für Tabellen / gespeicherte Prozeduren in SQL Management Studio
  • Trace-Flags
  • Nummer nach einer GOWiederholung der Charge
  • Sicherheit mit Schemata
  • Verschlüsselung mit integrierten Verschlüsselungsfunktionen, Ansichten und Basistabellen mit Triggern
Sklivvz
quelle
4
Wenn bekannt, wäre es schön, jeder Antwort die entsprechenden Versionen beizufügen. (2000 und höher, nur 2005, 2000 usw.)
bw
In dieser Frage steckt viel Gutes. Bitte nicht löschen! :-)
Sklivvz

Antworten:

91

In Management Studio können Sie eine Nummer nach einer GO-End-of-Batch-Markierung einfügen, damit der Batch so oft wiederholt wird:

PRINT 'X'
GO 10

Druckt 'X' 10 Mal. Dies kann Sie vor mühsamem Kopieren / Einfügen bewahren, wenn Sie sich wiederholende Dinge tun.

GilM
quelle
70

Viele SQL Server-Entwickler scheinen immer noch nichts über die OUTPUT-Klausel (SQL Server 2005 und neuer) in der Anweisung DELETE, INSERT und UPDATE zu wissen .

Es kann äußerst nützlich sein zu wissen, welche Zeilen INSERTed, UPDATEd oder DELETEd wurden, und die OUTPUT-Klausel ermöglicht dies sehr einfach - sie ermöglicht den Zugriff auf die aufgerufenen "virtuellen" Tabellen insertedund deleted(wie in Triggern):

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

Wenn Sie Werte in eine Tabelle mit einem Primärschlüsselfeld INT IDENTITY mit der OUTPUT-Klausel einfügen, können Sie die eingefügte neue ID sofort abrufen:

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

Und wenn Sie aktualisieren, kann es äußerst nützlich sein zu wissen, was sich geändert hat. In diesem Fall werden inserteddie neuen Werte (nach dem UPDATE) dargestellt, während deletedauf die alten Werte vor dem UPDATE verwiesen wird:

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

Wenn viele Informationen zurückgegeben werden, kann die Ausgabe von OUTPUT auch in eine temporäre Tabelle oder eine Tabellenvariable ( OUTPUT INTO @myInfoTable) umgeleitet werden .

Sehr nützlich - und sehr wenig bekannt!

Marc

marc_s
quelle
52

sp_msforeachtable: Führt einen Befehl mit '?' durch jeden Tabellennamen ersetzt. z.B

exec sp_msforeachtable "dbcc dbreindex('?')"

Sie können bis zu 3 Befehle für jede Tabelle ausgeben

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

Ebenfalls, sp_MSforeachdb

Mitch Wheat
quelle
2
Sie können den Namen der Tabelle in der Abfrage ermitteln, indem Sie einfache Anführungszeichen um das Fragezeichen verwenden. sp_msforeachtable "Anzahl auswählen (*), '?' als tabenm aus? "
Jody
51

Extras für Verbindungszeichenfolgen:

MultipleActiveResultSets = true;

Dadurch liest ADO.Net 2.0 und höher mehrere Nur-Vorwärts-Nur-Lese-Ergebnismengen auf einer einzelnen Datenbankverbindung. Dies kann die Leistung verbessern, wenn Sie viel lesen. Sie können es auch dann aktivieren, wenn Sie eine Mischung aus Abfragetypen ausführen.

Anwendungsname = MyProgramName

Wenn Sie nun eine Liste der aktiven Verbindungen anzeigen möchten, indem Sie die Tabelle sysprocesses abfragen, wird der Name Ihres Programms in der Spalte program_name anstelle von ".Net SqlClient Data Provider" angezeigt.

Chris Wenham
quelle
7
Ich habe den Anwendungsnamen in meinem Unternehmen zur Anforderung gemacht. Jede neue App muss einen eindeutigen Namen haben. Erleichtert das Auffinden, welche App gesperrt / beschädigt wurde, erheblich.
Neil N
2
Der Anwendungsname ist auch als Filter im Profiler verfügbar. Es ist sehr hilfreich, wenn Sie nur Ihre Abfragen und nicht die Abfragen Ihrer Mitarbeiter sehen möchten.
Mathias F
33

TableDiff.exe

  • Mit dem Tabellenunterschiedstool können Sie Unterschiede zwischen einer Quell- und Zieltabelle oder einer Ansicht erkennen und abgleichen. Das Tablediff-Dienstprogramm kann Unterschiede in Bezug auf Schema und Daten melden. Die beliebteste Funktion von tablediff ist die Tatsache, dass ein Skript generiert werden kann, das Sie auf dem Ziel ausführen können, um Unterschiede zwischen den Tabellen auszugleichen.

Verknüpfung

Sklivvz
quelle
31

Eine weniger bekannte TSQL-Technik zum Zurückgeben von Zeilen in zufälliger Reihenfolge:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())
Mitch Wheat
quelle
6
Ideal für kleine Ergebnismengen. Ich würde es nicht auf einem Tisch mit mehr als 10000 Zeilen verwenden, wenn Sie nicht Zeit haben
John Sheehan
Ich habe es auf Tischen verwendet, die viel größer sind, und es war nicht zu langsam.
Mitch Wheat
Was ist der Zweck der CHECKSUM ()? Sie können nur mit NEWID () bestellen.
Jonas Lincoln
6
Ich habe sogar anständige Ergebnisse in 100.000.000 (100 mil) Zeilen ohne CHECKSUM () gesehen. Außerdem muss ich auch fragen, warum nicht einfach ORDER BY NEWID?
Troy DeMonbreun
5
@GateKiller: Ich habe Ihre Bearbeitung zurückgesetzt, da die Prüfsumme () kein Fehler ist. Dadurch wird die Größe der Sortierspalte verringert.
Mitch Wheat
30

In Management Studio können Sie schnell eine durch Kommas getrennte Liste von Spalten für eine Tabelle abrufen, indem Sie:

  1. Erweitern Sie im Objekt-Explorer die Knoten unter einer bestimmten Tabelle (sodass Ordner für Spalten, Schlüssel, Einschränkungen, Trigger usw. angezeigt werden).
  2. Zeigen Sie auf den Ordner "Spalten" und ziehen Sie ihn in eine Abfrage.

Dies ist praktisch, wenn Sie kein abscheuliches Format verwenden möchten, das zurückgegeben wird, indem Sie mit der rechten Maustaste auf die Tabelle klicken und Script Table As ... und dann Insert To ... auswählen. Dieser Trick funktioniert mit den anderen Ordnern, da er Ihnen zur Verfügung steht Eine durch Kommas getrennte Liste der im Ordner enthaltenen Namen.

Thomas
quelle
23

Zeilenkonstruktoren

Sie können mehrere Datenzeilen mit einer einzigen Einfügeanweisung einfügen.

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')
Rob Boek
quelle
Ich habe das abgestimmt, es dann aber in MSSQL 2005 ausprobiert, und es funktioniert nicht. Nur 2008?
richardtallent
11
Ja, es ist eine neue Funktion von 2008.
Rob Boek
2
Dies war eine Funktion, die ich vermisst habe, als ich von DB2 zu SQL Server kam. In DB2 gab es eine signifikante Geschwindigkeitsverbesserung, wenn diese anstelle einzelner Einfügeanweisungen verwendet wurde
Nathan Koop
22

Wenn Sie die Tabellenstruktur, Indizes und Einschränkungen kennen möchten:

sp_help 'TableName'
Eduardo Molteni
quelle
Kombinieren Sie diesen Tipp mit der Tastenkombination! Markieren Sie zuerst einen Tabellennamen und drücken Sie dann ALT + F1
Michael J Swart
22

HashBytes () , um den MD2-, MD4-, MD5-, SHA- oder SHA1-Hash seiner Eingabe zurückzugeben.

Joel Coehoorn
quelle
Schön! Der richtige Link ist msdn.microsoft.com/en-us/library/ms174415(SQL.90).aspx (Version 2005)
Sklivvz
Sie haben Recht, das war die 2008er Version der Dokumente, obwohl die Seiten ziemlich identisch sind. Jetzt behoben.
Joel Coehoorn
20

Finden Sie die beliebtesten Abfragen heraus

  • Mit sys.dm_exec_query_stats können Sie viele Kombinationen von Abfrageanalysen mit einer einzigen Abfrage ermitteln.

Link mit dem commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc
Sklivvz
quelle
17

Auf der Registerkarte "Räumliche Ergebnisse" können Sie Kunst erstellen .

Geben Sie hier die Linkbeschreibung ein http://michaeljswart.com/wp-content/uploads/2010/02/venus.png

Martin Smith
quelle
7
Ich habe Jesus in meinen Abfrageergebnissen gesehen!
P Daddy
6
Pfff ... Welcher Trottel verschwendet seine Zeit damit, sich mit der Registerkarte "Räumliche Ergebnisse" zu beschäftigen. Oh warte ... Weißt du, ich dachte, dieser Beitrag kommt mir bekannt vor, jetzt erinnere ich mich warum.
Michael J Swart
16

AUSSER und INTERSECT

Anstatt aufwändige Verknüpfungen und Unterabfragen zu schreiben, sind diese beiden Schlüsselwörter eine viel elegantere Abkürzung und lesbare Möglichkeit, die Absicht Ihrer Abfrage beim Vergleich zweier Abfrageergebnisse auszudrücken. Ab SQL Server 2005 neu, ergänzen sie stark UNION, das bereits seit Jahren in der TSQL-Sprache existiert.

Die Konzepte von EXCEPT, INTERSECT und UNION sind grundlegend in der Mengenlehre, die als Grundlage und Grundlage für die relationale Modellierung dient, die von allen modernen RDBMS verwendet wird. Jetzt können Venn-Diagrammtypergebnisse mit TSQL intuitiver und einfacher generiert werden.

Ray Vega
quelle
16

Ich weiß, dass es nicht genau versteckt ist, aber nicht zu viele Leute kennen den PIVOT- Befehl. Ich konnte eine gespeicherte Prozedur ändern, die Cursor verwendete, und es dauerte 2 Minuten, bis ich auf einen schnellen 6-Sekunden-Code stieß, der ein Zehntel der Anzahl der Zeilen betrug!

Ronald Wildenberg
quelle
16

nützlich beim Wiederherstellen einer Datenbank zu Testzwecken oder was auch immer. Ordnet die Login-IDs neu zu:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
Kolten
quelle
Ich hatte diesen Prozess vorher nicht funktioniert, und ich musste den Besitz des Objekts in einen temporären Benutzer ändern, den ursprünglichen Benutzer löschen, das Original erneut hinzufügen und den Besitz zurückweisen. Ugh ...
StingyJack
15

Trennen Sie alle Verbindungen zur Datenbank:

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
GateKiller
quelle
Gibt es einen Einzeiler oder einen Drop-Datenbankparameter, der dies für mich erledigt? Ich stelle fest, dass, wenn Sie versuchen, die Datenbank über die Benutzeroberfläche zu löschen, ein Kontrollkästchen für das Schließen bestehender Verbindungen vorhanden ist, das impliziert, dass es sich um einen booleschen Parameter handelt.
DevinB
1
Eigentlich habe ich gerade eine zweizeilige Lösung gefunden. ALTER DATABASE [@ DATABASE_NAME @] SET READ_ONLY MIT ROLLBACK IMMEDIATE --Dieser trennt alle Benutzer ALTER DATABASE [@ DATABASE_NAME @] SET READ_WRITE MIT ROLLBACK IMMEDIATE DROP DATABASE [@ DATABASE_NAME @]
DevinB
1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEverhindert auch das Auftreten neuer Verbindungen.
ErikE
15

Tischprüfsumme

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

Reihenprüfsumme

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
GateKiller
quelle
2
Mit diesen können Sie eine Prüfsumme für alle Daten in der Tabelle erstellen. Auf einfache und schnelle Weise können Sie überprüfen, ob zwei Zeilen oder zwei Tabellen identisch sind.
GateKiller
15

Ich bin mir nicht sicher, ob dies eine versteckte Funktion ist oder nicht, aber ich bin darauf gestoßen und habe festgestellt, dass sie bei vielen Gelegenheiten nützlich ist. Sie können eine Reihe von Feldern in einer einzelnen select-Anweisung zusammenfassen, anstatt einen Cursor zu verwenden und die select-Anweisung zu durchlaufen.

Beispiel:

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

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

SELECT @nvcConcatonated

Ergebnisse:

Acme, Microsoft, Apple,
Sheki
quelle
2
Sie können auch COALESCE () verwenden, um dasselbe zu tun, ohne die Variable initialisieren zu müssen. SELECT @nvcConcatonated = COALESCE (@nvcConcatonated + ',', '') + CAST (C.CompanyName als VARCHAR (255)) FROM ...
Christopher Klein
Dies funktioniert auch in einer Update-Anweisung. Manchmal nützlich, um beispielsweise eine Liste der aktualisierten IDs zu verketten.
EBarr
14

Wenn Sie den Code einer gespeicherten Prozedur möchten, können Sie:

sp_helptext 'ProcedureName'

(Ich bin mir nicht sicher, ob es sich um eine versteckte Funktion handelt, aber ich benutze sie ständig.)

Eduardo Molteni
quelle
Ich weiß nicht warum, aber die Ausgabe von sp_helptext ist in übermäßig langen Zeilen im Original etwas doof. Beim Skripting von Sprocs passiert dies nicht. Vielleicht gibt es also einen anderen, robusteren Exportmechanismus? sp_helptext 'MyView' ist ebenfalls nützlich.
Kristen
Ich bin mir nicht sicher was du meinst. Für mich wird der SPs-Code in demselben Format ausgegeben, in dem ich sie in der Originaldatei (mit allen CRs usw.) geschrieben habe
Eduardo Molteni,
Ich erinnere mich nicht an die genauen Details, aber es hat mit der Art und Weise zu tun, wie der Text gespeichert wird - etwas über die Seitengröße, glaube ich. Die Ausgabe ist größtenteils korrekt, aber hin und wieder erhalten Sie einen zusätzlichen Zeilenumbruch.
RolandTumble
13

Ein Trick mit gespeicherten Prozeduren besteht darin, dass Sie sie über eine INSERT-Anweisung aufrufen können. Ich fand das sehr nützlich, als ich an einer SQL Server-Datenbank arbeitete.

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
Edomaur
quelle
1
Kann leider nicht mit @TableVariable
Kristen
Das Problem bei dieser sehr nützlichen Technik ist, dass Sie im Gegensatz zu den meisten # -Tabellen alle Spalten vollständig definieren müssen. Der träge Weg, dies zu tun, besteht darin, die # -Tabelle in dem Prozess zu erstellen, den Sie direkt am Ende aufrufen, dann sp_help in tempdb, kopieren und einfügen, Code aus proc entfernen. Fertig
Adolf Knoblauch
12

In SQL Server 2005/2008 werden Zeilennummern in einem SELECT-Abfrageergebnis angezeigt:

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

ORDER BY ist eine Pflichtklausel. Die OVER () -Klausel weist die SQL Engine an, Daten in der angegebenen Spalte (in diesem Fall OrderId) zu sortieren und Nummern gemäß den Sortierergebnissen zuzuweisen.

Binoj Antony
quelle
Es wäre nicht einfacher, wenn sie syntaktischen Zucker in der SQL-Engine verwenden würden, um das Syntaxwort als "RowNumberInTable" zu analysieren
keine
1
+1 für Fensterfunktionen. Sie können Dinge über eine Teilmenge von Datensätzen tun, indem Sie OVER (PARTITION BY ...) msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
Matt Stephenson
10

Nützlich zum Parsen von Argumenten für gespeicherte Prozeduren: xp_sscanf

Liest Daten aus der Zeichenfolge in die Argumentpositionen, die von jedem Formatargument angegeben werden.

Im folgenden Beispiel wird xp_sscanf verwendet, um zwei Werte aus einer Quellzeichenfolge basierend auf ihren Positionen im Format der Quellzeichenfolge zu extrahieren.

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

Hier ist die Ergebnismenge.

-------------------- -------------------- 
products10.tmp        random
Sklivvz
quelle
4
Ich muss einen dummen Moment haben (nein, wirklich). Können Sie mir sagen, wo wir das verwenden können?
Raj More
9

Nur Rückgabedatum

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

oder

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
GateKiller
quelle
Kurzversion - SELECT CAST (FLOOR (CAST (@DateTime AS FLOAT)) AS DATETIME)
Meff
Auf jedenfall. CASTFLOORCAST-Regeln.
StingyJack
Ich kann keinen Verweis darauf finden, aber ich erinnere mich an Tests, die darauf hinwiesen, dass SELECT DateAdd (Tag, 0, DateDiff (Tag, 0, @DateTime)) schneller war. Ich bin froh, erleuchtet zu sein!
Kristen
Fand this sqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617 , enthielt jedoch nicht die CAST / FLOOR-Methode. Ein informeller Test mit einem mittelgroßen Recordset legt nahe, dass DATEADD etwa 7% schneller als CAST / FLOOR ist - nicht genug, um sich in den meisten Situationen Sorgen zu machen
Kristen,
Ich habe jedoch die andere Methode hinzugefügt; Meine schnellen Tests haben gezeigt, dass die Gussbodenmethode 800 Nanosekunden schneller ist. Also eigentlich nichts drin.
GateKiller
9

dm_db_index_usage_stats

Auf diese Weise können Sie feststellen, ob die Daten in einer Tabelle kürzlich aktualisiert wurden, auch wenn die Tabelle keine DateUpdated-Spalte enthält.

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')

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

Informationen, auf die verwiesen wird von: SQL Server - Wie lautet das Datum und die Uhrzeit der zuletzt eingefügten Zeile einer Tabelle?

Verfügbar in SQL 2005 und höher

Nathan Koop
quelle
7

Hier sind einige Funktionen, die ich nützlich finde, aber viele Leute scheinen nichts zu wissen:

sp_tables

Gibt eine Liste von Objekten zurück, die in der aktuellen Umgebung abgefragt werden können. Dies bedeutet jedes Objekt, das in einer FROM-Klausel erscheinen kann, mit Ausnahme von Synonymobjekten.

Verknüpfung

sp_stored_procedures

Gibt eine Liste der gespeicherten Prozeduren in der aktuellen Umgebung zurück.

Verknüpfung

Sklivvz
quelle
7

Suchen Sie nach Datensätzen, deren Datum irgendwo in der aktuellen Woche liegt.

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

Suchen Sie nach Aufzeichnungen, welches Datum letzte Woche aufgetreten ist.

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

Gibt das Datum für den Beginn der aktuellen Woche zurück.

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

Gibt das Datum für den Anfang der letzten Woche zurück.

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )
GateKiller
quelle
Gut, aber der Index für TransDate wird nicht verwendet. Ich würde lieber schreiben
Vaso
Dabei ist TransDate> = konvertieren (Datum / Uhrzeit, Etage (konvertieren (float, dateadd (Tag, -Datum (Wochentag, @Datum) +1, @Datum))) und TransDate> = konvertieren (Datum / Uhrzeit, Etage (konvertieren (float, dateadd) (Tag, 7-Datumsteil (Wochentag, @Datum) +1, @Datum)))
Vaso
Korrektur: wobei TransDate> = konvertieren (Datum / Uhrzeit, Etage (Konvertieren (float, dateadd (Tag, -Datenteil (Wochentag, @Datum) +1, @Datum))) und TransDate <Konvertieren (Datum / Uhrzeit, Etage (Konvertieren (Float, dateadd (Tag, 7-Datumsteil (Wochentag, @Datum) +1, @Datum))))
Vaso
7

Nicht so sehr eine versteckte Funktion, aber das Einrichten von Tastenzuordnungen in Management Studio unter Extras \ Optionen \ Tastatur: Alt + F1 ist standardmäßig sp_help "Ausgewählter Text", aber ich kann nicht ohne das Hinzufügen von Strg + F1 für sp_helptext "Ausgewählter Text" leben.

JohnD
quelle
Ich benutze, um den USE-Befehl auch zu konfigurieren, um mich entlang der
Datenbank
7

Persistent-berechnete Spalten

  • Berechnete Spalten können Ihnen dabei helfen, die Laufzeitberechnungskosten in die Datenänderungsphase zu verschieben. Die berechnete Spalte wird mit dem Rest der Zeile gespeichert und transparent verwendet, wenn der Ausdruck in den berechneten Spalten und die Abfrage übereinstimmen. Sie können auch Indizes auf den PCCs erstellen, um die Filterung und Bereichsüberprüfung des Ausdrucks zu beschleunigen.

Verknüpfung

Sklivvz
quelle
7

Es gibt Zeiten, in denen keine geeignete Spalte zum Sortieren vorhanden ist oder Sie nur die Standardsortierreihenfolge für eine Tabelle festlegen und jede Zeile auflisten möchten. Um dies zu tun, können Sie "(wählen Sie 1)" in die "order by" -Klausel einfügen und Sie erhalten, was Sie wollen. Ordentlich, was?

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