2010-12-09 12 views
2

Ich habe eine Tabelle wie dieseSQL-Abfrage mit Feldern vom Typ NUMERIC

CREATE TABLE MyTable (
    [MyTableID] [int] NOT NULL, 
    [Description] [varchar](50) NOT NULL, 
    CONSTRAINT [PK_AddressType] PRIMARY KEY CLUSTERED (
     [MyTableID] ASC 
    ) 
) ON [PRIMARY] 

erklären Kann jemand, warum die folgende Abfrage funktioniert auch, wenn ich den Feldwert in einfachen Anführungszeichen bin auch?

SELECT * 
FROM MyTable 
WHERE MyTableID = '1' 

Ist dies eine SQL Server-spezifische Funktion? Es ist ANSI/SQL?

Antwort

6

Was Sie demonstriert haben, wird üblicherweise als implizite Datenkonvertierung bezeichnet - die Daten werden automatisch in den Datentyp der Spalte konvertiert, mit der verglichen wird. Da ein String mit dem Wert "1" in einen numerischen Datentyp mit dem Wert 1 konvertiert werden kann, funktionieren die Dinge gut. Implizite Datentypkonvertierungen können hier gemäß der precedence list auftreten.

Explizite Datenkonvertierung ist, wenn Sie Funktionen wie CAST or CONVERT verwenden.

String zu numerisch (und umgekehrt) wird auf allen Datenbanken unterstützt, die ich kenne - SQL Server, Oracle, MySQL, PostgreSQL ... Die CAST-Funktion ist ANSI, IIRC. Andere Datentypen sind nicht so flexibel - Daten & Datumsangaben zum Beispiel.

+0

Diese Art der impliziten Datenkonvertierung ist spezifisch für SQL Server richtig? Ich bin fast sicher, dass die Abfrage wird fehlschlagen an Oracle und DB2 – Lorenzo

+0

@Lorenzo: Ich habe aktualisiert, während Sie kommentieren, aber nein - es ist nicht spezifisch für SQL Server. –

+0

Ok! Vielen Dank für die Erklärung. Ich habe dies gerade entdeckt, als ich versuchte, einen Fehler in meinem Code zu verursachen. Wenn ich das vorher wüsste, waren einige der Abfrage-Builder-Klassen, die ich schrieb, viel einfacher :) – Lorenzo

3

Zusätzlich zu OMG Ponys beantworten.

Implizite Datentypkonvertierungen können hier gemäß precedence list auftreten.

Sie können eine Ursache für Leistungsprobleme sein, wenn der Datentyp einer Konstanten oder eines Parameters in einem Vergleichselement einen höheren Vorrang hat als der der Spalte. In diesem Fall müssen die Spaltenwerte einer impliziten Konvertierung unterzogen werden, was bedeutet, dass ein Index nicht verwendet werden kann.

+1

Ich fügte meiner Antwort die Vorrangliste hinzu; Ich vergesse es immer wieder. –

Verwandte Themen