Die Spalten einer View enthalten die falschen Daten

Frage:
Eine View liefert in den Spalten nicht die korrekten Inhalte, sondern Inhalte von anderen Spalten.

Lösung:
In der zugrundeliegenden Tabelle wurde die Reihenfolge der Spalten verändert.
Diese Änderung wird nur dann automatisch an der View angepasst, wenn die View mit der Option with schemabinding angelegt wird.
with schemabinding verhindert aber das nachträgliche Ändern von Tabellen.
Um die View an die geänderte Tabelle anzupassen, muss die Systemprozedur sp_refreshview ‚viewname‘ ausgeführt werden
.

/* übernommen aus der Original sqlfaq.de */

Identitätsspalte zu klein

Frage:
Das Einfügen eines neuen Datensatzes in eine Tabelle mit IDENTITY-Spalte wird mit der Fehlermeldung „Arithmetischer Ãœberlauffehler beim Konvertieren von IDENTITY in den Datentyp int.“ abgebrochen.

Lösung:
Eine Identitätsspalte wird mit dem Feldtyp integer angelegt.
Die Fehlermeldung „Arithmetischer Ãœberlauffehler beim Konvertieren von IDENTITY in den Datentyp int.“ deutet darauf hin, dass der neu erzeugte IDENTITY-Wert zu groß für eine Spalte vom Datentyp
integer ist.
Um weitere Datensätze in der Tabellen einfügen zu können, muss der Datentyp der Identitätsspalte auf bigint geändert werden. Die obere Grenze des bigint sollte so schnell nicht erreicht werden.

/* übernommen aus der Original sqlfaq.de */

DRI oder Trigger

Frage:
Beim Upsizing einer Access-Datenbank auf den SQL Server muß innerhalb des Upsizing-Assistenten die Entscheidung getroffen werden, ob DRI oder Trigger angelegt werden soll. Worin bestehen sind die Unterschiede?

Lösung:
DRI steht für Deklarative Referentielle Integrität und wird zur Prüfung der Datenkonsistenz genutzt.
Bei einer bestehenden Beziehung zwischen zwei Tabellen können z.B. keine Datensätze gelöscht werden, wenn es innerhalb der Beziehung noch abhängige Datensätze gibt. Mit DRI reagiert der SQL Server bei einem solchen Löschversuch mit einem Fehler.

Eine Aktualisierungs- und Löschweitergabe wird mit der DRI nicht durchgeführt. Diese kann aber mit Trigger abgebildet werden.
Ein Trigger ist T-SQL-Code, der bei einer Aktion an einer Tabelle – UPDATE, DELETE, INSERT – ausgelöst wird.

Welche Option beim Upsizing gewählt wird, hängt von den eigenen Anforderungen ab. Soll eine Aktualisierungs- und Löschweitergabe implementiert werden, sollte die Option Trigger ausgewählt werden. Der Upsizing-Wizzard erstellt dann die notwendigen Trigger.

/* übernommen aus der Original sqlfaq.de */

Unterschied decimal zu float

Frage:
Worin bestehen die Unterschiede in den Datentypen decimal bzw. numeric und float bzw. real?

Lösung:
Werte, die bei der Erfassung bis auf die letzte Ziffer gespeichert werden müssen, sollten mit den Datentypen decimal oder numeric gespeichert werden.

Werte, die berechnet werden und dabei ein Ergebnis wie 0,33333 (Periode) haben, sollten mit den Datentypen float bzw. real gespeichert werden. Der Wert wird in diesen Datentypen mit der höchstmöglichen Genauigkeit gespeichert. real arbeitet mit einem größeren Bereich als float.

* übernommen aus der Original sqlfaq.de */

Abfrage einer Datenansicht speichern

Frage:
Im SQL-Server 2000 ist es möglich, den Inhalt der Datenansicht einer Tabelle über eine Abfrage einzugrenzen. Innerhalb der Abfragendefinition wird über das Kontextmenü die Möglichkeit angeboten, diese Abfrage zu speichern. Die Abfragen werden aber nicht gespeichert.

Lösung:
Stimmt, denn das Speichern der Abfrage wird trotz des Angebots im Kontextmenü nicht unterstützt. Dies wird in der SQL Server-Hilfe bestätigt.

Also bleibt nur der eher umständliche Weg, den SQL-String zu kopieren, eine neue View zu erstellen, dort den SQL-String einzufügen und die neue View zu speichern.

* übernommen aus der Original sqlfaq.de */

Systemtabellen ausblenden

Frage:
Die Systemtabellen können im Enterprise Manager ausgeblendet werden.
An welcher Stelle befindet sich diese Option?

Lösung:
Die Systemtabellen können innerhalb der SQL Server-Registrierung ausgeschaltet werden.
Im Kontextmenü des SQL Servers kann über Eigenschaften der SQL Server-Registrierung bearbeiten … der Dialog zur Verwaltung der Eigenschaften gestartet werden. Hier muß die Option Systemdatenbanken und Systemobjekte anzeigen deaktiviert werden.

* übernommen aus der Original sqlfaq.de */

Datentypen CHAR und VARCHAR

Frage:
Was sind die genauen Unterschiede zwischen den Datentypen char und varchar?

Lösung:
In beiden Datentypen können alphanumerische Zeichen gespeichert werden.

Dabei wird beim Datentyp char der reservierte Platz immer bis zur vollen Länge mit Leerstellen aufgefüllt. Dies gilt auch beim Wert NULL. Dadurch belegt der Datentyp bei an sich variablen Werten deutlich mehr Platz in den Daten- und Indexseiten. Char sollte nur für solche Spalten genutzt werden, die in der Regel fast vollständig gefüllt werden.

Der Datentyp Varchar wird nur bis zur eigentlichen Länge des Wertes gefüllt. Die Länge des Wertes wird ebenfalls gespeichert. Hierfür wird 1 Byte benötigt. Ein Feld vom Typ varchar(1) macht keinen Sinn, da intern 2 Bytes genutzt werden. Eins für den eigentlichen Wert und ein weiteres für die Information, daß der Wert nur 1 Byte groß ist.

* übernommen aus der Original sqlfaq.de */

Temporäre Tabellen (#temp und ##temp)

Frage:
Worin besteht der Unterschied einer globalen temporären Tabelle (##temp) zu einer lokalen temporären Tabelle (#temp)?

Lösung:
Die lokalen temporären Tabellen (#) sind nur innerhalb der Session vorhanden, in der sie erzeugt wurden.
Eine in einer Stored Procedure erzeugte #temp-Tabelle steht auch nur in dieser Stored Procedure zur Verfügung. Sofern die Stored Procedure weitere Stored Procedures aufruft, kann die temporäre Tabelle auch in diesen genutzt werden. Die temporäre Tabelle ist außerhalb der Stored Procedure nicht sichtbar. Nach Beendigung der äußeren Stored Procedure wird die temporäre Tabelle gelöscht.

Eine globale temporäre Tabelle (##) ist auch außerhalb der Session, in der sie erstellt wurde, sichtbar.
Die globale wird wie die lokale innerhalb einer Session erzeugt und gelöscht, wenn diese Session beendet wird. Doch gerade beim Löschen besteht der große Unterschied zur lokalen. Da die globale temporäre Tabelle auch außerhalb der Session sichtbar ist, kann sie auch von anderen Sessions genutzt werden. Beim Beenden der Session, die die globale temporäre Tabelle erstellt hat, wird diese nur dann gelöscht, wenn keine andere Session mit der Tabelle arbeitet. Ist dies aber der Fall, bleibt die Tabelle solange bestehen, bis die letzte Session, die mit der Tabelle arbeitet, beendet wird
.

/* übernommen aus der Original sqlfaq.de */