Konvertierungen von SQL in C

In der folgenden Tabelle werden Probleme aufgelistet, die zu berücksichtigen sind, wenn Sie Datum-/Uhrzeit-Typen von SQL Server in C-Typen konvertieren.

Konvertierungen

SQL_C_DATE

SQL_C_TIME

SQL_C_TIMESTAMP

SQL_C_BINARY

SQL_C_CHAR

SQL_C_WCHAR

SQL_CHAR

2,3,4,5

2,3,6,7,8

2,3,9,10,11

1

1

1

SQL_WCHAR

2,3,4,5

2,3,6,7,8

2,3,9,10,11

1

1

1

SQL_TYPE_DATE

OK

12

13

14

16

16

SQL_SS_TIME2

12

8

15

17

16

16

SQL_TYPE_TIMESTAMP

18

7,8

OK

19

16

16

SQL_SS_TIMESTAMPOFFSET

18,22

7,8,20

20

21

16

16

Schlüssel in Symbole

Symbol

Bedeutung

OK

Keine Konvertierungsprobleme

1

Es gelten die Regeln vor SQL Server 2008.

2

Führende und nachfolgende Leerzeichen werden ignoriert.

3

Die Zeichenfolge wird in Datum, Uhrzeit, Zeitzone oder Zeitunterschied der Zeitzone zerlegt und kann bis zu 9 Stellen für Sekundenbruchteile enthalten. Wenn die Angabe des Zeitunterschieds einer Zeitzone analysiert wird, wird die Zeitangabe in die Clientzeitzone konvertiert. Tritt während dieser Konvertierung ein Fehler auf, dann wird ein Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Überlauf im Datetime-Feld" generiert.

4

Wenn der Wert kein gültiger DATE-, TIMESTAMP- oder TIMESTAMPOFFSET-Wert ist, wird ein Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe" generiert.

5

Wenn die Zeitangabe ungleich Null ist, dann wird ein Diagnosedatensatz mit SQLSTATE 01S07 und der Meldung "Teilbereiche wurden abgeschnitten" generiert.

6

Wenn der Wert kein gültiger TIME-, TIMESTAMP- oder TIMESTAMPOFFSET-Wert ist, wird ein Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe" generiert.

7

Die Datumskomponente wird ignoriert.

8

Wenn die Sekundenbruchteile ungleich Null sind, dann wird ein Diagnosedatensatz mit SQLSTATE 01S07 und der Meldung "Teilbereiche wurden abgeschnitten" generiert.

9

Wenn der Wert kein gültiger DATE-, TIME-, TIMESTAMP- oder TIMESTAMPOFFSET-Wert ist, wird ein Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe" generiert.

10

Wenn der Wert eine gültige Zeitangabe ist, wird die Datumskomponente auf das aktuelle Clientdatum festgelegt.

11

Wenn der Wert ein gültiges Datum ist, wird die Uhrzeitkomponente auf Null festgelegt.

12

Es wird ein Diagnosedatensatz mit SQLSTATE 07006 und der Meldung "Attributverletzung beschränkter Datentypen" generiert.

13

Die Uhrzeit wird auf 0 (Null) festgelegt.

14

Wenn der Puffer nicht groß genug zum Speichern eines SQL_DATE_STRUCT-Werts ist, wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Gültigkeitsbereichs" generiert.

15

Das Datum wird auf das aktuelle Clientdatum festgelegt.

16

Wenn der Puffer nicht groß genug zum Speichern des konvertierten Zeichenfolgenwerts ist, sondern nur die Sekundenbruchteile aufnehmen kann, dann wird ein Diagnosedatensatz mit SQLSTATE 01004 und der Meldung "Die Zeichenfolgedaten wurden rechts abgeschnitten" generiert. Wenn der Puffer nicht groß genug zum Speichern des Zeichenfolgenwerts ist, ohne dass die Datums-, Uhrzeit- oder Offsetkomponenten abgeschnitten werden, dann wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Gültigkeitsbereichs" generiert. Beachten Sie, dass für DATE- und TIMESTAMPOFFSET-Werte SQLSTATE 01004 nicht ausgegeben werden kann, weil sich am rechten Ende der konvertierten Zeichenfolge keine Sekundenbruchteile befinden. Deshalb verursacht jedes Abschneiden Datenverluste.

17

Wenn der Puffer nicht groß genug zum Speichern eines SQL_SS_TIME2_STRUCT-Werts ist, wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Gültigkeitsbereichs" generiert.

18

Wenn die Zeitangabe ungleich Null ist, dann wird ein Diagnosedatensatz mit SQLSTATE 01S07 und der Meldung "Teilbereiche wurden abgeschnitten" generiert.

19

Wenn der Servertyp datetime oder smalldatetime ist, wird der Wert ebenso wie in SQL Server 2000 und früheren Versionen zurückgegeben. Dies entspricht dem TDS-Übertragungsformat und für smalldatetime einem ein 4 Byte großen Wert und für datetime einem 8 Byte großen Wert.

Wenn der Servertyp datetime2 ist, wird der Wert als SQL_TIMESTAMP_STRUCT zurückgegeben. Wenn der Puffer nicht groß genug zum Speichern des zurückgegebenen Werts ist, wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Gültigkeitsbereichs" generiert.

20

Die Zeitangabe wird in die Clientzeitzone konvertiert. Tritt während dieser Konvertierung ein Fehler auf, dann wird ein Diagnosedatensatz mit SQLSTATE 22008 und der Meldung "Überlauf im Datetime-Feld" generiert.

21

Wenn der Puffer groß genug ist, um einen SQL_SS_TIMESTAMPOFFSET_STRUCT-Wert aufzunehmen, wird der Wert als SQL_SS_TIMESTAMPOFFSET_STRUCT zurückgegeben. Andernfalls wird ein Diagnosedatensatz mit SQLSTATE 22003 und der Meldung "Numerischer Wert außerhalb des Gültigkeitsbereichs" generiert.

22

Der Wert wird in die Clientzeitzone konvertiert, bevor das Datum extrahiert wird. Dadurch wird für die Konsistenz mit anderen Konvertierungen mit timestampoffset-Typen gesorgt. Tritt während dieser Konvertierung ein Fehler auf, dann wird ein Diagnosedatensatz mit SQLSTATE 22008 und der Meldung "Überlauf im Datetime-Feld" generiert. Dies könnte in einem Datum resultieren, das sich von dem Wert unterscheidet, der sich durch einfaches Abschneiden ergibt.

Die Tabelle in diesem Thema beschreibt die Konvertierung der Typen, die an den Client zurückgegeben werden, aus den in der Bindung verwendeten Typen. Bei Ausgabeparametern wird vom Server eine implizite Konvertierung durchgeführt, wenn der in SQLBindParameter angegebene Servertyp nicht dem tatsächlich auf dem Server vorhandenen Typ entspricht, und der an den Client zurückgegebene Typ entspricht dann dem in SQLBindParameter angegebenen Typ. Dies kann zu unerwarteten Konvertierungsergebnissen führen, wenn sich die Konvertierungsregeln des Servers von den in obiger Tabelle genannten Regeln unterscheiden. Wenn beispielsweise ein Standarddatum bereitgestellt werden muss, verwendet SQL Server 1900-1-1 statt des aktuellen Datums.