i. Deklarieren des Cursors
In diesem Schritt müssen Sie die Eigenschaften des Cursors und die generierte Ergebnismenge gemäß den Anforderungen angeben. Es gibt zwei Möglichkeiten, einen Cursor anzugeben.
Formular 1 (ANSI 92)
DECLARE Cursorname [INSENSITIVE] [SCROLL] CURSOR
FÜR select_statement
[FOR {READ ONLY |. UPDATE][OF columns_list]}]
Formular 2
DECLARE Cursor_Name CURSOR
[LOCAL]
[FORWARD_ONLY |. KEYSET |. DYNAMIC]
FOR select_statement
{READ ONLY |. UPDATE ][OF columns_list]}]
Das Schlüsselwort INSENSITIVE gibt an, dass eine temporäre Kopie für die abgerufene Ergebnismenge erstellt werden soll und zukünftige Daten aus dieser temporären Kopie abgerufen werden. Wenn sich die Daten in der ursprünglichen Basistabelle während der nachfolgenden Cursorverarbeitung ändern, sind sie für den Cursor nicht sichtbar. Dieser unempfindliche Cursor lässt keine Datenänderungen zu.
Das Schlüsselwort SCROLL gibt an, dass der Cursor in jede Richtung scrollen kann. Alle Abrufoptionen (erster, letzter, nächster, relativer, absoluter) können in Cursorn verwendet werden. Wenn diese Option weggelassen wird, kann der Cursor nur vorwärts (nächstes) scrollen.
Select_statement gibt die von der SQL-Anweisung erstellte Ergebnismenge an. Die Transact-SQL-Anweisungen COMPUTE, COMPUTE BY, FOR BROWSE und INTO sind in der Select-Anweisung einer Cursordeklaration nicht zulässig.
NUR LESEN gibt an, dass Datenänderungen im Cursor-Ergebnissatz nicht zulässig sind.
Das Schlüsselwort UPDATE gibt an, dass die Ergebnismenge des Cursors geändert werden kann.
OF columns_list gibt die Spalten im Ergebnissatz an, die geändert werden können. Standardmäßig (mit dem Schlüsselwort UPDATE) können alle Spalten geändert werden.
Das Schlüsselwort LOCAL gibt an, dass der Cursor lokal ist und nur innerhalb des Prozesses verwendet werden kann, in dem er deklariert ist.
Das Schlüsselwort GLOBAL macht den Cursor global für die gesamte Verbindung sichtbar. Globale Cursor sind jederzeit verfügbar, wenn die Verbindung aktiv ist. Erst wenn die Verbindung beendet wird, ist der Cursor nicht mehr verfügbar.
FORWARD_ONLY gibt an, dass der Cursor nur vorwärts scrollen kann.
STATISCHE Cursor sind die gleichen wie INSENSITIVE Cursor.
KEYSET gibt die Reihenfolge der ausgewählten Zeilen an. SQL Server erstellt aus dem Ergebnissatz einen temporären Schlüsselwortsatz. Wenn Änderungen an Nicht-Schlüsselwortspalten der Datenbank vorgenommen werden, sind diese für den Cursor sichtbar. Da es sich um einen festen Satz von Schlüsselwörtern handelt, sind Änderungen an der Schlüsselwortspalte oder neu eingefügte Spalten nicht sichtbar.
DYNAMIC gibt an, dass der Cursor alle Änderungen am Ergebnissatz widerspiegelt.
SCROLL_LOCK dient zum Sperren von Änderungen oder Löschungen, um den Erfolg von Cursoroperationen sicherzustellen.
OPTIMISTIC gibt an, welche Änderungen oder Löschungen über den Cursor nicht erfolgreich sind.
Hinweis:
· Wenn DISTINCT-, UNION- oder GROUP BY-Anweisungen in der SELECT-Anweisung verwendet werden und die Auswahl einen Aggregatausdruck enthält, ist der Cursor automatisch ein INSENSITIVE-Cursor.
· Wenn die Basistabelle keinen eindeutigen Index hat, wird der Cursor als INSENSITIVE-Cursor erstellt.
· Wenn die SELECT-Anweisung ORDER BY enthält und die Spalte ORDER BY kein eindeutiger Zeilenbezeichner ist, wird der DYNAMIC-Cursor in einen KEYSET-Cursor umgewandelt. Wenn der KEYSET-Cursor nicht geöffnet werden kann, wird er in einen INSENSITIVE-Cursor umgewandelt. Das Gleiche gilt für Cursor, die mit SQL ANSI-92-Syntax definiert wurden, jedoch ohne das Schlüsselwort INSENSITIVE.
Öffnen eines Cursors
Durch Öffnen eines Cursors wird eine Ergebnismenge erstellt. Der Cursor wird durch die DECLARE-Anweisung definiert, seine tatsächliche Ausführung erfolgt jedoch durch die OPEN-Anweisung. Die Syntax lautet wie folgt:
OPEN { { [GLOBAL] Cursor_Variablenname} |.
GLOBAL gibt einen globalen Cursor an.
Cursorname ist der Name des geöffneten Cursors.
Cursor_variable_name ist der Variablenname des referenzierten Cursors. Die Variable sollte vom Typ Cursor sein.
Nachdem der Cursor geöffnet wurde, kann die Systemvariable @@cursor_rows verwendet werden, um die Anzahl der Zeilen im Ergebnissatz zu ermitteln. Wenn @@cursor_rows eine negative Zahl ist, bedeutet dies, dass der Cursor asynchron migriert wird und sein absoluter Wert (wenn @@cursor_rows -5 ist, ist der absolute Wert 5) die Anzahl der Zeilen im aktuellen Ergebnissatz. Mit asynchronen Cursorn können Benutzer weiterhin auf die Ergebnisse eines Cursors zugreifen, während der Cursor vollständig migriert ist.
III. Übernehmen Sie den Wert vom Cursor.
Während Sie den Wert vom Cursor übernehmen, können Sie sich in jeder Zeile der Ergebniskonzentration hin und her bewegen. Wenn der Cursor als scrollbar definiert ist (unter Verwendung des Schlüsselworts SCROLL bei der Deklaration), kann jede Zeile im Ergebnissatz jederzeit abgerufen werden. Bei nicht scrollenden Cursorn können Abrufvorgänge nur für die Zeile neben der aktuellen Zeile ausgeführt werden. Die Ergebnismenge kann aus lokalen Variablen abgerufen werden. Die Syntax des Fetch-Befehls lautet wie folgt:
FETCH [FIRST | }
[INTO @variable_name ][,...n]]
NEXT gibt an, den Wert aus der nächsten Zeile der aktuellen Zeile abzurufen.
PRIOR gibt an, den Wert aus der vorherigen Zeile der aktuellen Zeile abzurufen.
FIRST ist die erste Zeile der Ergebnismenge.
LAST ist die letzte Zeile der Ergebnismenge.
ABSOLUTE n stellt die n-te Zeile in der Ergebnismenge dar. Die Zeilennummer kann auch über eine lokale Variable weitergegeben werden. Zeilennummern beginnen bei 0, sodass Sie keine Zeilen erhalten können, wenn n 0 ist.
RELATIVE n bedeutet, dass die abzurufende Zeile n Zeilen vor oder n Zeilen nach der aktuellen Zeile liegt. Wenn der Wert eine positive Zahl ist, liegt die abzurufende Zeile n Zeilen vor der aktuellen Zeile. Wenn der Wert negativ ist, wird die Zeile nach der aktuellen Zeile zurückgegeben.
INTO @cursor_variable_name stellt die Variablenliste dar, in der der Cursorspaltenwert gespeichert ist. Die Anzahl der Variablen in dieser Liste sollte mit der Anzahl der Variablen übereinstimmen, die von der SELECT-Anweisung in der DECLARE-Anweisung verwendet werden. Der Datentyp der Variablen sollte außerdem mit dem Datentyp der ausgewählten Spalte übereinstimmen. Der Wert in der Variablen bleibt bis zur nächsten Verwendung der FETCH-Anweisung erhalten.
Jede FETCH-Ausführung wird in der Systemvariablen @@fetch_status gespeichert. Wenn der FETCH erfolgreich ist, wird @@fetch_status auf 0 gesetzt. @@fetch_status von -1 zeigt an, dass ein Teil der Ergebnismenge erreicht wurde (z. B. wurde eine Zeile in der Basistabelle gelöscht, nachdem der Cursor geöffnet wurde). @@fetch_status kann zum Erstellen einer Cursor-Verarbeitungsschleife verwendet werden.
Zum Beispiel:
DECLARE @iname char(20), @fname char(20)
ÖFFNEN Sie author_cur
FETCH FIRST FROM author_cur INTO @iname, @fname
WHILE @@fetch_status = 0
BEGIN
IF @fname = 'Albert'
DRUCKEN Sie „Albert Ringer gefunden“
SONST
Drucken Sie „Anderen Ringer“
FETCH NEXT FROM author_cur INTO @iname, @fname
ENDE
. Nachdem der Cursor geschlossen wurde, kann kein FETCH-Vorgang ausgeführt werden. Wenn Sie die FETCH-Anweisung weiterhin verwenden müssen, müssen Sie den Cursor erneut öffnen. Die Syntax lautet wie folgt:
CLOSE [GLOBAL] Cursor_Name |. Cursor_Variablenname
v. Die DEALLOCATE-Anweisung gibt Sperren für Datenstrukturen und Cursor frei. Die Syntax lautet wie folgt:
DEALLOCATE [GLOBAL] Cursor_Name |. Cursor_Variablenname
Ein vollständiges Beispiel eines Cursors ist unten angegeben:
USE master
GO
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sysobjects WHERE type='u'
OPEN table_cur
FETCH NEXT FROM table_cur INTO @TableName
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
. SELECT @msg = „ Erstellen von Indizes für die Tabelle“+@TableName+“…“
PRINT @msg
SELECT @cmd = „DBCC DBREINDEX ('“+@TableName+“')“
EXEC (@cmd)
PRINT „ „
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO
Das folgende Skript führt sp_BuildIndexes
für die PUBS-Datenbank aus. USE pubs
GO
EXEC ap_BuildIndexes
Hinweis: Das Obige ist auch ein Beispiel für die Erstellung einer benutzerdefinierten gespeicherten Systemprozedur.
Temporäre Tabelle verwenden
Temporäre Tabellen sind in TempDB erstellte Tabellen. Die Namen temporärer Tabellen beginnen alle mit „#“. Der Bereich einer temporären Tabelle ist die Verbindung, die die temporäre Tabelle erstellt hat. Da temporäre Tabellen nicht von zwei Verbindungen gemeinsam genutzt werden können, wird die temporäre Tabelle verworfen, sobald die Verbindung geschlossen wird. Wenn die temporäre Tabelle innerhalb einer gespeicherten Prozedur erstellt wird, liegt der Bereich der temporären Tabelle innerhalb der gespeicherten Prozedur oder einer gespeicherten Prozedur, die von der gespeicherten Prozedur aufgerufen wird. Wenn Sie temporäre Tabellen zwischen Verbindungen teilen müssen, müssen Sie globale temporäre Tabellen verwenden. Die globale temporäre Tabelle beginnt mit dem Symbol „##“ und bleibt in der Datenbank bestehen, bis SQL Server neu gestartet wird. Sobald eine solche temporäre Tabelle erstellt ist, können alle Benutzer darauf zugreifen. Berechtigungen können für temporäre Tabellen nicht explizit angegeben werden. Temporäre Tabellen bieten die Möglichkeit, Zwischenergebnisse zu speichern. Manchmal können temporäre Tabellen auch die Leistung verbessern, indem sie eine komplexe Abfrage in zwei Abfragen aufteilen. Dies kann erreicht werden, indem die Ergebnisse der ersten Abfrage zunächst in einer temporären Tabelle gespeichert werden und die temporäre Tabelle dann in der zweiten Abfrage verwendet wird. Temporäre Tabellen werden empfohlen, wenn eine Teilmenge einer großen Tabelle während eines bestehenden Verfahrens mehrmals verwendet wird. In diesem Fall kann die Leistung erheblich verbessert werden, wenn eine Teilmenge der Daten zur Verwendung in nachfolgenden Verknüpfungen in einer temporären Tabelle gespeichert wird. Indizes können auch für temporäre Tabellen erstellt werden.
Das Obige ist der Inhalt von Erste Schritte mit SQL Server 7.0 (7). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!