A7. T-SQL


 

A7.40. SELECT-Statement mit variablem Tabellennamen
A7.39. RAISERROR
A7.38. Daten skripten
A7.37. Zeichen in String zählen
A7.36. Registry auslesen
A7.35. Indexname und -spalten ermitteln
A7.34. Spalten eines Index ermitteln
A7.33. Integer-Wert mit führenden Nullen
A7.32. Vergleich von Datumswerten ohne Uhrzeit
A7.31. Aktuelles Alter ermittlen
A7.30. Prüfung, ob Feld in Tabelle existiert
A7.29. case-sensitiver Vergleich von Zeichenfolgen
A7.28. Dezimaltrennzeichen als Komma im String
A7.27. Zahl mit führenden Nullen ausgeben
A7.26. Auflistung der Datenbanken
A7.25. Ergebnis einer Stored Procedure speichern
A7.24. Globale Variable in T-SQL
A7.23. Arrays in T-SQL
A7.22. Tabelle kopieren
A7.21. Kalenderwoche ermitteln
A7.20. Massenänderung an allen Tabellen
A7.19. Anführungszeichen bei Stringverkettung
A7.18. Set @variable oder Select @variable
A7.17. Neuen Wert der Identity-Spalte ermitteln
A7.16. Cursor auf Systemprocedure
A7.15. Vergleich mit Groß-/Kleinschreibung
A7.14. Debugger für T-SQL
A7.13. Anzahl Zeilen einer Abfrage ermitteln
A7.12. Zeichenfolge N'
A7.11. Kommentare in T-SQL
A7.10. Probleme mit @@Error
A7.9. Vergleich mit Ausdrücken
A7.8. Vergleich mit LIKE '%wert%'
A7.7. Berechnung eines Zeitraums
A7.6. Ausgabe des Ergebnis limitieren
A7.5. Prüfung ob Objekt existiert
A7.4. Fehlerbehandlung
A7.3. Löschen eines Index
A7.2. Auflisten der Benutzertabellen einer Datenbank
A7.1. Datum ohne Zeit aus datetime-Feld



A7.40. SELECT-Statement mit variablem Tabellennamen

Problem:
In einem SELECT-Statement soll der Tabellenname durch eine lokale Variable ersetzt werden.

Lösung:
In SQL-Statements können Variablen zwar in Ausdrücken, nicht aber anstelle von Objektnamen oder Schlüsselwörtern benutzt werden.
Um den Tabellennamen in einem SQL-Statement erst zur Laufzeit zu ersetzen, muss mit dynamischen SQL gearbeitet werden.
Dazu wird das SQL-Statement zur Laufzeit zu einem String zusammengesetzt und mit Execute oder sp_executesql ausgeführt.
Zum Thema "Dynamisches SQL" hat Frank Kalis einen interessanten Artikel "Dynamisches SQL - Fluch und Segen" bereitgestellt.

Betrifft Version: 2005-2000-7.0
zurück


A7.39. RAISERROR

Problem:
Obwohl ein RAISERROR mit Schweregrad 16 ausgeführt wird, wird die laufende Stored Procedure beim
RAISERROR nicht beendet.

Lösung:
Der Schweregrad 16 beendet eine Stored Procedrue nur dann, wenn auch wirklich ein Fehler aufgetreten ist. RAISERROR löst nicht einen Fehler aus, sondern belegt lediglich den @@ERROR-Wert mit der angegebenen Fehlernummer.
Folgendes Mini-Skript soll das Verhalten des RAISERROR verdeutlichen:

PRINT @@ERROR
RAISERROR ('Es ist nix passiert!', 16, 1)
IF @@ERROR = 0 PRINT 'Es ist wirklich nix passiert!'

-- oder mit sp_addmessage

PRINT @@ERROR
EXEC sp_addmessage 50001, 16, N'Es ist nix passiert!', 'us_english'
RAISERROR (50001, 16, 1)
IF @@ERROR = 0
PRINT 'Es ist wirklich nix passiert!'
ELSE
PRINT 'So richtig ist immer noch nix passiert, aber es hat eine Fehlernummer!'
EXEC sp_dropmessage 50001, 'us_english'
GO


Betrifft Version: 2005-2000-7.0
zurück


A7.38. Daten skripten

Problem:
Die Daten einiger Tabellen sollen als INSERT-Statements in eine Textdatei exportiert werden.

Lösung:
itrain bietet ein Skript an, mit dem solche INSERT-Statements erzeugt werden können.

Betrifft Version: 2000-7.0
zurück


A7.37. Zeichen in String zählen

Problem:
Gibt es eine Möglichkeit per SQL bestimmte Zeichen in einer Zeichenfolge zu zählen?

Lösung:
Len('avcdafra') - Len(Replace('avcdafra','a',''))
von Josef Pötzl

Betrifft Version: 2005-2000-7.0
zurück


A7.36. Registry auslesen

Problem:
Per T-SQL sollen Werte aus der Registry gelesen werden.

Lösung:
Es gibt eine undokumentierte Stored Procedure in der Datenbank master namens dbo.xp_regread mit den Parametern Rootkey, Path und Value.

Beispiel:
DECLARE @bla varchar(10)
exec master.dbo.xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='SOFTWARE\.....', @value_name='wert', @inhalt=@inhalt OUTPUT


Betrifft Version: 2000
zurück


A7.35. Indexname und -spalten ermitteln

Problem:
Der Indexname mit den entsprechenden Spalten aller Tabellen einer Datenbank soll ermittelt werden.

Lösung:
Dazu bietet Frank Kalis zwei Lösungen an:
http://www.insidesql.de/content/view/136/
http://www.insidesql.de/content/view/155/

Betrifft Version: 2000
zurück


A7.34. Spalten eines Index ermitteln

Problem:
Die Spalten eines Index sollen ermittelt werden.

Lösung:
Da hilft die Stored Procedure exec sp_helpindex 'deineTabelle' oder die Variante von Frank Kalis.

Betrifft Version: 2000
zurück


A7.33. Integer-Wert mit führenden Nullen

Problem:
Ein Integer-Wert soll mit führenden Nullen ausgegeben werden.

Lösung:
Eine Kombination der Befehle STR und REPLACE liefert den Integer-Wert mit führenden Nullen als String zurück.

Folgendes Beispiel liefert "000001":
DECLARE @a INT
SET @a = 1
SELECT REPLACE(STR(@a,6),' ',0)


Betrifft Version: 2005-2000-7.0
zurück


A7.32. Vergleich von Datumswerten ohne Uhrzeit

Problem:
Das Datum aus zwei Spalten vom Typ datetime soll ohne Uhrzeit verglichen werden.

Lösung:
Der Inhalt der datetime-Spalte muss vorher in eine Spalte vom Typ varchar(10) konvertiert werden:
convert(varchar(10), meindatum, 112) = convert(varchar(10), meinanderesdatum, 112)

Betrifft Version: 2005-2000-7.0
zurück


A7.31. Aktuelles Alter ermittlen

Problem:
Anhand des Geburtsdatum soll das aktuelle Alter ermittelt werden.

Lösung:
Beispiele gibt es unter www.insidesql.de/content/view/304/ und www.insidesql.de/content/view/206/

Betrifft Version: 2005-2000-7.0
zurück


A7.30. Prüfung, ob Feld in Tabelle existiert

Problem:
Per T-SQL soll geprüft werden, ob ein Feld in einer Tabelle existiert.

Lösung:
Ähnlich wie in A7.6 beschrieben, kann dies über die Schematas gelöst werden.
If Exists
(Select * From Information_Schema.Columns Where Table_Name = 'tabellenname' And Column_Name = 'spaltenname')
Select 'Feld vorhanden'
Else Select 'Feld nicht vorhanden'

Vielen Dank für diesen Beitrag an Thomas Fischer.

Betrifft Version: 2000-7.0
zurück


A7.29. case-sensitiver Vergleich von Zeichenfolgen

Problem:
Per T-SQL sollen Zeichenfolgen case-sensitiv verglichen werden.

Lösung:
Der Vergleich wird über die Erweiterung der WHERE-Condition mit der COLLATE-Anweisung möglich.
WHERE SpalteA = SpalteB COLLATE Latin1_General_CS_AS

Betrifft Version: 2000
zurück


A7.28. Dezimaltrennzeichen als Komma im String

Problem:
Gleitkommazahlen in varchar-Spalten sollen in den Datentyp money konvertiert werden.
Wegen dem Dezimaltrennzeichen werden die Zahlen nicht korrekt konvertiert. So wird z.B. aus der Zahl 123,45 die Zahl 12345,00.
Wie wird eine korrekte Konvertierung erreicht?

Lösung:
Da gibt es zwei Möglichkeiten:
SELECT CAST(REPLACE(zahl,',','.') AS DECIMAL(8,2))
oder
SELECT CAST(REPLACE(REPLACE(zahl,'.',''),',','.') AS DECIMAL(8,2))

Vielen Dank für diesen Beitrag an Frank Kalis.

Betrifft Version: 2000-7.0
zurück


A7.27. Zahl mit führenden Nullen ausgeben

Problem:
Eine einstellige Zahl soll mit führenden Nullen angezeigt werden.

Lösung:
Für eine solche Ausgabe muss die Zahl in einen String konvertiert und dieser mit den führenden Nullen ergänzt werden.
Folgende Konvertierung liefert das Ergebnis:
right('00' + convert(varchar(2),zahl),2) wird der Zahl eine führende Null vorangestellt.
Beispiel:

declare @Datum datetime
set @datum = '20040101'
select right('00' + convert(varchar(2),day(@Datum)),2)

oder mit einer Zahl:
declare @Zahl int
set @Zahl = 1
select right('00' + convert(varchar(2),@Zahl), 2)
Vielen Dank für diesen Beitrag an Christa Kurschat.

Betrifft Version: 2000-7.0
zurück


A7.26. Auflistung der Datenbanken

Problem:
Die Datenbanken einer SQL Server-Installation sollen aufgelistet werden.

Lösung:
Dazu gibt es zwei Möglichkeiten:
Entweder mit dem SQL-Statement Select name From master..sysdatabases oder über eine Auswertung der Schematas mit Select catalog_name From Information_Schema.Schemata.

Microsoft empfiehlt die Schematas zu nutzen, da sich die Systemtabellen des SQL Servers in Zukunft ändern könnten.

Betrifft Version: 2000-7.0
zurück


A7.25. Ergebnis einer Stored Procedure speichern

Problem:
Das Ergebnis einer Stored Procedure soll in einer Tabelle gespeichert werden.

Lösung:
Per Insert Into tabellenname EXEC procname wird das Ergebnis in einer Tabelle gespeichert.
Voraussetzung dafür ist, dass die die Tabelle entsprechend den Ergebnisspalten der Stored Procedure angelegt wurde.
Vielen Dank für diesen Beitrag an Sebastino Martina.

Betrifft Version: 2000-7.0
zurück


A7.24. Globale Variable in T-SQL

Problem:
In SQL Server sollen globale Variablen definiert und in verschiedenen Stored Procedures genutzt werden.

Lösung:
Globale Variablen werden in SQL Server nicht unterstützt. Aber es gibt eine Alternative:

Create Table GlobaleVariable
    (
      Id int Not Null Primary Key,
      -- Gängige Typen
      IntegerVariable int Null,
      StringVariable varchar(255) Null
    )
Go
Insert Into GlobaleVariable (Id, IntegerVariable) Values(4711, 4712)
Go

--Handhabung innerhalb der Stored Procedure
Declare @gVariable int

Select @gVariable = Variable From GlobaleVariable Where Id = 4711
Vielen Dank für diesen Beitrag an Elmar Boye.

Betrifft Version: 2000-7.0
zurück


A7.23. Arrays in T-SQL

Problem:
Sind Arrays in T-SQL möglich?

Lösung:
Arrays werden von T-SQL nicht unterstützt.
Als Alternative kann eine temporäre Tabelle erstellt.
Eine andere Möglichkeit ist ein selbst definiertes Array in einer Variable vom Typ varchar(8000), auf die mit Offset-Berechnung zugegriffen wird.
Beide Alternativen sind aber nur ein schwacher Ersatz.

Betrifft Version: 2000-7.0
zurück


A7.22. Tabelle kopieren

Problem:
Eine Tabelle mitsamt den Daten soll kopiert werden.

Lösung:
Das SQL-Statement Select Felder Into neueTabelle From alteTabelle erstellt eine neue Tabelle anhand der Ergebnisspalten der Abfrage und kopiert die Daten der Quelltabelle in die neue Tabelle. Indizies, Defaults, ForeignKeys usw. werden dabei nicht kopiert.
Um das Kopieren der Daten zu vermeiden, muss das Statement nur um eine WHERE-Condition wie Where 0 = 1 erweitert werden.

Betrifft Version: 2000-7.0
zurück


A7.21. Kalenderwoche ermitteln

Problem:
Die Kalenderwoche eines Datums soll ermittelt werden.

Lösung:
Das SQL-Statement Select Datepart(Week, Getdate()) liefert die Kalenderwoche des aktuellen Datums.
Leider ist die ermittelte Kalenderwoche nicht nach europäischer bzw. deutscher Norm. Es wird automatisch der 1. Januar in die 1. Kalenderwoche gesetzt. Der Fehler kann nur mit einer eigens programmierten Stored Procedure korrigiert werden. Unter Downloads gibt es hierfür das Script Kalenderwoche ermitteln.

Betrifft Version: 2000-7.0
zurück


A7.20. Massenänderung an allen Tabellen

Problem:
An allen Benutzertabellen soll eine neue Spalte ergänzt werden. Gibt es eine Möglichkeit, die neue Spalte direkt an allen Tabellen zu ergänzen?

Lösung:
In der Systemdatenbank master gibt es die undokumentierte Stored Procedure sp_msforeachtable 'befehl'.
Dieser Stored Procedure kann als Parameter ein SQL-Statement übergeben werden, das bei der Ausführung gegen alle Tabellen der Datenbank ausgeführt wird. Dieses Beispiel ergänzt jede Benutzertabelle mit dem Feld LastChange vom Typ datetime:

master..sp_msforeachtable 'Alter Table ? Add LastChange datetime'


Betrifft Version: 2000-7.0
zurück


A7.19. Anführungszeichen bei Stringverkettung

Problem:
Innerhalb einer Stringverkettung muß ein Wert in einfachen Anführungszeichen angegeben werden.
Das erste Anführungszeichen des Wertes wird aber als Kennzeichnung für das Ende des Strings interpretiert.

Lösung:
Die einfachen Anführungszeichen (') innerhalb des Werts müssen doppelt angegeben werden.
Beispiel:
Set @localvariable = 'Select feld1 From tabelle1 Where feld1 like ''me%'''

Betrifft Version: 2000-7.0
zurück


A7.18. Set @variable oder Select @variable

Problem:
Einer Variablen kann ein Wert mit Set oder mit Select zugewiesen werden. Worin besteht der Unterschied?

Lösung:
Laut der Online-Hilfe soll der Befehl Set genutzt werden.
Als Begründung wird angegeben, dass bei Select das Ergebnis mehrere Datensätze umfassen könnte. In diesem Fall wird der Wert des letzten Datensatzes der Variable zugewiesen.
Bei Set wird immer nur ein Wert der Variable zugewiesen. Eine Zuweisung wie Set @variable = (Select feld From Tabelle) produziert einen Fehler, sobald das Ergebnis mehr als einen Datensatz umfasst.

Betrifft Version: 2000-7.0
zurück


A7.17. Neuen Wert der Identity-Spalte ermitteln

Problem:
Der neu erzeugte Wert einer Identity-Spalte soll ermittelt werden.

Lösung:
Dafür gibt es drei Vorgehensweisen, die kleine aber feine Unterschiede haben:

SELECT @@Identity liefert den letzten Identity-Wert eines Gültigkeitsbereichs
Beispiel:
Der Insert in eine Tabelle ergibt den Identity-Wert 7. Durch den Insert wird ein Trigger aktiviert, der in einer anderen Tabelle ebenfalls einen Datensatz anlegt. Dort ergibt der Insert den Identity-Wert 20. Die Rückgabe per SELECT @@Identity ist 20.

SELECT Current_Id FROM tabelle liefert den letzten Identity-Wert der angegebenen Tabelle.
Beispiel:
Benutzer A speichert einen neuen Datensatz und erzeugt dabei den Identity-Wert 8. Benutzer B speichert in der Zwischenzeit auch einen neuen Datensatz und erzeugt dabei den Identity-Wert 9. Beide Benutzer A erhalten den Wert 9.

SELECT Scope_Identity liefert den letzten Identity-Wert des aktuellen Gültigkeitsbereichs.
Beispiel:
Benutzer A speichert per Stored Procedure neuen Datensatz. Der neue Identity-Wert ist 8. Benutzer B speichert auch einen neuen Datensatz, der den Identity-Wert 9 ergibt. Benutzer A erhält den Wert 8, Benutzer B den Wert 9.

Betrifft Version: 2000-7.0
zurück


A7.16. Cursor auf Systemprocedure

Problem:
Das Ergebnis der Systemprocedure sp_who soll in einen Cursor geladen werden.

Lösung:
Die Deklaration eines Cursors per Exec ist nicht möglich.
Das Ergebnis der Systemprocedure sp_who kann aber weiterverarbeitet werden, wenn es vorher in eine temporäre Tabelle geschrieben wird.
Beispiel:
Create Table #temp (feld1 typ, feld2 typ, ...)
Insert #temp Exec sp_who
Declare who_cursor Cursor For Select * From #temp
usw.

Betrifft Version: 2000-7.0
zurück


A7.15. Vergleich mit Groß-/Kleinschreibung

Problem:
Die Eingabe eines Passwords soll geprüft werden. Bei dem Vergleich soll die Groß-/Kleinschreibung beachtet werden.

Lösung:
Der Vergleich zweier Strings mit Beachtung der Groß-/Kleinschreibung ist nur möglich, sofern bei der SQL Server Installation die Option Groß-/Kleinschreibung beachten aktiviert wurde.
Ist dies nicht der Fall, muss für einen case-sensitiven Vergleich der Inhalt der Spalte in den Datentyp Binary konvertiert werden.
Beispiel:
Select * From benutzertabelle Where feldbenutzer = @User And Convert(Varbinary, feldpassword) = Convert(Varbinary, @Password)

Betrifft Version: 7.0
zurück


A7.14. Debugger für T-SQL

Problem:
Gibt es für T-SQL einen Debugger?

Lösung:
SQL Server 7.0 bietet nur die unkokumentierte System-Procedure sp_sdidebug an.
Ab SQL Server 2000 wird der Transact-SQL-Debugger mitgeliefert, der im Query Analyzer über den Objektkatalog verfügbar ist. Dieser wird mit F8 aktiviert. Über das Kontextmenü der einzelnen Stored Procedure kann der Debugger gestartet werden.

Betrifft Version: 2000-7.0
zurück


A7.13. Anzahl Zeilen einer Abfrage ermitteln

Problem:
Innerhalb einer Stored Procedure soll die Verarbeitung nur dann fortgeführt werden, wenn das Ergebnis des SQL-Statements mehr als 0 Zeilen beinhaltet. Wie kann die Anzahl der Ergebniszeilen ermittelt werden?

Lösung:
Die Anzahl der ermittelten Ergebniszeilen stehen in der globalen Variable @@Rowcount.
Der Wert von @@Rowcount wird beim nächsten Statement wieder gelöscht und neu festgelegt. Daher sollte der Wert direkt in einer lokalen Variablen vom Typ Integer gespeichert werden.

Betrifft Version: 2000-7.0
zurück


A7.12. Zeichenfolge N'

Problem:
In generierten Befehlen des SQL Servers und auch in der Hilfe wird oft die Zeichenfolge N' vor einem String verwendet.
Was hat diese Zeichenfolge zu bedeuten?

Lösung:
N' kennzeichnet den nachfolgenden String als Unicode.

Betrifft Version: 2000-7.0
zurück


A7.11. Kommentare in T-SQL

Problem:
Eine Stored Procedure soll dokumentiert werden. Wie können einzelne Zeilen oder Blöcke von Zeilen als Kommentar gekennzeichnet werden?

Lösung:
Komplette Blöcke werden mit /* am Anfang und mit */ am Ende des Blocks, einzelne Zeilen oder Fragmente am Ende einer Kommandozeile mit -- markiert.

Betrifft Version: 2000-7.0
zurück


A7.10. Probleme mit @@Error

Problem:
Eine Stored Procedure beinhaltet eine Fehlerbehandlung über @@Error. Bei Verwendung von Transaction funktioniert die Fehlerbehandlung nicht mehr.

Lösung:
Nach Begin Transaction sollte direkt Set Nocount On folgen. Dadurch kann der Wert in @@Error wieder ausgelesen werden.
Die Nocount-Einstellung muss vor dem Commit wieder mit Set Nocount Off ausgeschaltet werden.

Betrifft Version: 7.0
zurück


A7.9. Vergleich mit Ausdrücken

Problem:
Ein Vergleich mit Where preis + 1 > 2 führt zu einem TableScan, obwohl die Spalte indiziert ist.

Lösung:
Ein berechneter Ausdruck sollte innerhalb eines Vergleichs so formuliert werden, dass er nur auf einer Seite der Bedingung steht.
Nur so kann der Index genutzt werden.
In dem angeführten Beispiel würde Where preis > 1 dasselbe Ergebnis liefern.

Betrifft Version: 2000-7.0
zurück


A7.8. Vergleich mit LIKE '%wert%'

Problem:
Ein SQL-Statement mit Like '%wert%' führt zu einem TableScan, obwohl die Spalte indiziert ist.

Lösung:
Durch die Verwendung des Platzhalterzeichens % am Beginn des Suchausdrucks wird die Nutzung des Index verhindert und dadurch der TableScan ausgelöst.

Betrifft Version: 2000-7.0
zurück


A7.7. Berechnung eines Zeitraums

Problem:
Der Zeitraum zwischen zwei Datumswerten soll ermittelt werden..

Lösung:
Select Case
   When DateAdd(Year, Datediff(Year, datum1, datum2), datum1) > datum2 THEN Datediff(Year, datum1, datum2) - 1
   Else DateDiff(Year, datum1, datum2)
End as Differenz


Betrifft Version: 2005-2000-7.0
zurück


A7.6. Ausgabe des Ergebnis limitieren

Problem:
Die Ausgabe eines SELECT-Statements soll auf eine bestimmte Anzahl Zeilen limitiert werden.

Lösung:
Die Ausgabe kann mit Set Rowcount auf eine bestimmte Anzahl Zeilen limitiert werden. So liefert Set Rowcount 5 lediglich 5 Zeilen der Ausgabe. Nach der Verarbeitung muss die Begrenzung unbedingt mit Set Rowcount 0 wieder aufgehoben werden.
Eine Alternative ist die Klausel Top im SELECT-Statement. Select Top 5 feldname From tabelle liefert 5 Ergebniszeilen. Diese Variante wird vom Abfrageoptimierer erkannt und ist daher auch die performantere Alternative.

Betrifft Version: 2005-2000-7.0
zurück


A7.5. Prüfung ob Objekt existiert

Problem:
Mit T-SQL soll überprüft werden, ob ein bestimmtes Objekt existiert.

Lösung:
Hier gibt es mehrere Möglichkeiten:

1) Die Auswertung der Schematas mittels
If Exists(Select * From Information_Schema.Tables Where Table_Name = 'tabellenname')

2) Die Auswertung der Systemtabelle sysobjects mittels
If Exists(Select name From sysobjects Where name = tabellenname and type = 'u')

3) Mit der Stored Procedure Objekt_Id:
If Object_Id('tabellenname') = 0 ...
oder besser
If Objectproperty (Object_id('tabellenname', 'IsTable') = 1 ...

Betrifft Version: 2000-7.0
zurück


A7.4. Fehlerbehandlung

Problem:
In einer Stored Procedure soll eine Fehlerbehandlung implementiert werden.

Lösung:
Eine Fehlerbehandlung kann mit der globalen Variable @@Error implementiert werden.
Bei jedem SQL-Statement wird in dieser Variable die Fehlernummer des Statements gespeichert. Tritt kein Fehler auf, wird der Wert 0 gespeichert. Das ist auch der Grund, warum innerhalb der Fehlerbehandlung der Wert von @@Error immer zuerst in einer lokale Variable vom Typ integer gespeichert werden sollte.

Betrifft Version: 2000-7.0
zurück


A7.3. Löschen eines Index

Problem:
An einer Tabelle soll ein Index gelöscht werden. Mittels sp_helpindex tabelle wurde der Indexname ermittelt.
Das Statement Drop Index indexname führt jedoch zu einem Fehler.

Lösung:
Mit Drop Index indexname werden nur Indizes, aber keine Einschränkungen (Constraints) gelöscht.
Ob es sich bei dem zu löschenden Index um eine Einschränkung handelt, kann mit der Stored Procedure sp_helpindex indexname ermittelt werden. In der Spalte index_description sind die Indezies am Eintrag unique und die Constraints an unique key zu erkennen.
Ein Constraint kann nur mit Alter Table tabellenname Drop Constraint constraintname gelöscht werden.

Betrifft Version: 2000-7.0
zurück


A7.2. Auflisten der Benutzertabellen einer Datenbank

Problem:
Eine Auflistung der Benutzertabellen soll erstellt werden. Die Systemtabellen der Datenbank sollen in dieser Liste nicht vorkommen

Lösung:
Die Benutzertabellen können mit einer Abfrage auf der Systemtabelle sysobjects mit Select name From sysobjects Where type = 'u' oder über die Schematas mit Select table_name From Information_Schema.Tables ermittelt werden.
Microsoft empfiehlt die Schematas zu nutzen, da sich die System-Tabellen des SQL Servers in Zukunft ändern könnten.

Betrifft Version: 2000-7.0
zurück


A7.1. Datum ohne Zeit aus datetime-Feld

Problem:
Ein SELECT-Statement, dass in der WHERE-Condition den Vergleich einer datetime-Spalte mit einem Datum enthält, liefert keine bzw. falsche Ergebnisse.

Lösung:
Die datetime-Spalte speichert das Datum immer mit der Uhrzeit und somit wird auch die Uhrzeit mit in den Vergleich einbezogen. Dies kann zu falschen Ergebnissen führen.
Wenn nur das Datum verglichen werden soll, muss der Wert der datetime-Spalte vor dem Vergleich in einen String konvertiert werden, der auch nur das Datum beinhaltet. Die Online-Hilfe bietet unter den Stichworten convert und cast eine Übersicht der Syntax für die Konvertierung in die unterschiedlichen Datumsformate.
Ein Datum im Format "dd.mm.yyyy" wird mit der Syntax Convert(datetime,convert(char(10),datumspalte,104)) konvertiert. Die Zahl 104 kennzeichnet dabei das Format des Datums mit vierstelliger Jahrhundertzahl.

Betrifft Version: 2000-7.0
zurück