Salin Massal Perubahan untuk Tipe Tanggal dan Waktu yang Ditingkatkan (OLE DB dan ODBC)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Topik ini menjelaskan penyempurnaan tanggal/waktu untuk mendukung fungsionalitas penyalinan massal. Informasi dalam topik ini berlaku untuk OLE DB dan ODBC di SQL Server Native Client.

Penting

SQL Server Native Client (sering disingkat SNAC) telah dihapus dari SQL Server 2022 (16.x) dan SQL Server Management Studio 19 (SSMS). SQL Server Native Client (SQLNCLI atau SQLNCLI11) dan Penyedia Microsoft OLE DB warisan untuk SQL Server (SQLOLEDB) tidak direkomendasikan untuk pengembangan aplikasi baru. Beralih ke Microsoft OLE DB Driver (MSOLEDBSQL) baru untuk SQL Server atau Microsoft ODBC Driver terbaru untuk SQL Server ke depannya. Untuk SQLNCLI yang dikirim sebagai komponen SQL Server Database Engine (versi 2012 hingga 2019), lihat pengecualian Siklus Hidup Dukungan ini.

Format File

Saat membangun file format secara interaktif, tabel berikut menjelaskan input yang digunakan untuk menentukan jenis tanggal/waktu dan nama jenis data file host yang sesuai.

Jenis penyimpanan file Jenis data file host Respons terhadap perintah: "Masukkan jenis penyimpanan file bidang <field_name> [<default>]:"
Tanggalwaktu SQLDATETIME d
Waktu smalldatetime SQLDATETIM4 D
Tanggal SQLDATE de
Waktu SQLTIME te
Tanggalwaktu2 SQLDATETIME2 d2
Datetimeoffset SQLDATETIMEOFFSET do

File format XML XSD akan memiliki penambahan berikut:

<xs:complexType name="SQLDATETIME2">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLDATETIMEOFFSET">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLDATE">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLTIME">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  

File Data Karakter

Dalam file data karakter, nilai tanggal dan waktu diwakili seperti yang dijelaskan dalam bagian "Format Data: String dan Literal" dari Dukungan Tipe Data untuk Peningkatan Tanggal dan Waktu ODBC untuk ODBC, atau Dukungan Tipe Data untuk Peningkatan Tanggal dan Waktu OLE DB untuk OLE DB.

Dalam fle data asli, nilai tanggal dan waktu untuk empat jenis baru diwakili sebagai representasi TDS mereka dengan skala 7 (karena ini adalah maksimum yang didukung oleh SQL Server dan file data bcp tidak menyimpan skala kolom ini). Tidak ada perubahan pada penyimpanan jenis tanggalwaktu dan smalldatetime yang ada atau representasi aliran data tabular (TDS).

Ukuran penyimpanan untuk berbagai jenis penyimpanan adalah sebagai berikut untuk OLE DB:

Jenis penyimpanan file Ukuran penyimpanan dalam byte
datetime 8
smalldatetime 4
date 3
waktu 6
tanggalwaktu2 9
tanggalwaktulewat 11

Ukurannya adalah sebagai berikut untuk ODBC. Perhatikan bahwa tidak perlu menyimpan presisi dalam format atau file data, karena BCP.exe akan selalu mengambil presisi dari server.

Jenis penyimpanan file Ukuran penyimpanan dalam byte Format penyimpanan
datetime (d) 8 TDS
smalldatetime (D) 4 TDS
tanggal (de) 3 TDS
time (te) 6 TDS
datetime2 (d2) 9 TDS
datetimeoffset (do) 11 TDS

Jenis BCP dalam sqlncli.h

Jenis berikut didefinisikan dalam sqlncli.h untuk digunakan dengan ekstensi API BCP ke ODBC. Jenis ini diteruskan dengan parameter eUserDataType dari IBCPSession::BCPColFmt di OLE DB.

Jenis penyimpanan file Jenis data file host Ketik sqlncli.h untuk digunakan dengan IBCPSession::BCPColFmt Nilai
Tanggalwaktu SQLDATETIME BCP_TYPE_SQLDATETIME 0x3d
Waktu smalldatetime SQLDATETIM4 BCP_TYPE_SQLDATETIME4 0x3a
Tanggal SQLDATE BCP_TYPE_SQLDATE 0x28
Waktu SQLTIME BCP_TYPE_SQLTIME 0x29
Tanggalwaktu2 SQLDATETIME2 BCP_TYPE_SQLDATETIME2 0x2a
Datetimeoffset SQLDATETIMEOFFSET BCP_TYPE_SQLDATETIMEOFFSET 0x2b

Konversi Tipe Data BCP

Tabel berikut ini menyediakan informasi konversi.

Catatan OLE DB Konversi berikut dilakukan oleh IBCPSession. IRowsetFastLoad menggunakan konversi OLE DB seperti yang didefinisikan dalam Konversi yang Dilakukan dari Klien ke Server. Perhatikan bahwa nilai tanggalwaktu dibulatkan ke 1/300 dari nilai detik dan smalldatetime memiliki detik yang diatur ke nol setelah konversi klien yang dijelaskan di bawah ini telah dilakukan. Pembulatan tanggalwaktu menyebar melalui jam dan menit, tetapi bukan tanggal.

Untuk-->

Dari
date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat char wchar
Tanggal 1 - 1,6 1,6 1,6 1,5,6 1,3 1,3
Waktu T/A 1,10 1,7,10 1,7,10 1,7,10 1,5,7,10 1,3 1,3
Waktu smalldatetime 1,2 1,4,10 1 1 1,10 1,5,10 1.11 1.11
Tanggalwaktu 1,2 1,4,10 1,12 1 1,10 1,5,10 1.11 1.11
Tanggalwaktu2 1,2 1,4,10 1,10 (ODBC)1,12 (OLE DB) 1,10 1,10 1,5,10 1,3 1,3
Datetimeoffset 1,2,8 1,4,8,10 1,8,10 1,8,10 1,8,10 1,10 1,3 1,3
Karakter/karakter (tanggal) 9 - 9,6 (ODBC)9,6,12 (OLE DB) 9,6 (ODBC)9,6,12 (OLE DB) 9,6 9,5,6 T/A T/A
Char/wchar (waktu) - 9,10 9,7,10 (ODBC)9,7,10,12 (OLE DB) 9,7,10 (ODBC)9,7,10, 12 (OLE DB) 9,7,10 9,5,7,10 T/A T/A
Char/wchar (datetime) 9,2 9,4,10 9,10 (ODBC)9,10,12 (OLE DB) 9,10 (ODBC)9,10,12 (OLE DB) 9,10 9,5,10 T/A T/A
Char/wchar (datetimeoffset) 9,2,8 9,4,8,10 9,8,10 (ODBC)9,8,10,12 (OLE DB) 9,8,10 (ODBC)9,8,10,12 (OLE DB) 9,8,10 9,10 T/A T/A

Kunci ke Simbol

Simbol Arti
- Tidak ada konversi yang didukung.

Catatan diagnostik ODBC dihasilkan dengan SQLSTATE 07006 dan pesan "Pelanggaran atribut jenis data terbatas".
1 Jika data yang disediakan tidak valid, rekaman diagnostik ODBC dihasilkan dengan SQLSTATE 22007 dan pesan "Format tanggalwaktu tidak valid". Untuk nilai datetimeoffset, bagian waktu harus dalam rentang setelah konversi ke UTC, bahkan jika tidak ada konversi ke UTC yang diminta. Ini karena TDS dan server selalu menormalkan waktu dalam nilai datetimeoffset untuk UTC. Jadi klien harus memeriksa bahwa komponen waktu berada dalam rentang yang didukung setelah konversi ke UTC.
2 Komponen waktu diabaikan.
3 Untuk ODBC, Jika pemotongan dengan kehilangan data terjadi, rekaman diagnostik dihasilkan dengan SQLSTATE 22001 dan pesan 'Data string, terpotong kanan' Jumlah digit detik pecahan (skala) ditentukan dari ukuran kolom tujuan sesuai dengan tabel berikut. Untuk ukuran kolom yang lebih besar dari rentang dalam tabel, skala 7 tersirat. Konversi ini harus memungkinkan hingga sembilan digit detik pecahan, maksimum yang diizinkan oleh ODBC.

Jenis: DBTIME2

Skala tersirat 0 8

Skala tersirat 1..7 10,16



Jenis: DBTIMESTAMP

Skala tersirat 0: 19

Skala tersirat 1..7: 21..27



Jenis: DBTIMESTAMPOFFSET

Skala tersirat 0: 26

Skala tersirat 1..7: 28..34

Untuk OLE DB, jika pemotongan dengan kehilangan data terjadi, kesalahan diposting. Untuk datetime2, jumlah digit detik pecahan (skala) ditentukan dari ukuran kolom tujuan sesuai dengan tabel berikut. Untuk ukuran kolom yang lebih besar dari rentang dalam tabel skala 9 tersirat. Konversi ini harus memungkinkan hingga sembilan digit detik pecahan, maksimum yang diizinkan oleh OLE DB.

Jenis: DBTIME2

Skala tersirat 0 8

Skala tersirat 1..9 1..9



Jenis: DBTIMESTAMP

Skala tersirat 0: 19

Skala tersirat 1..9: 21..29



Jenis: DBTIMESTAMPOFFSET

Skala tersirat 0: 26

Skala tersirat 1..9: 28..36
4 Komponen tanggal diabaikan.
5 Zona waktu diatur ke UTC (misalnya, 00:00).
6 Waktu diatur ke nol.
7 Tanggal diatur ke 1900-01-01.
8 Offset zona waktu diabaikan.
9 String diurai dan dikonversi ke nilai tanggal, tanggalwaktu, datetimeoffset, atau waktu, tergantung pada karakter tanda baca pertama yang ditemui dan adanya komponen yang tersisa. String kemudian dikonversi ke jenis target, mengikuti aturan dalam tabel di akhir topik ini untuk jenis sumber yang ditemukan oleh proses ini. Jika data yang disediakan tidak dapat diurai tanpa kesalahan, atau jika ada bagian komponen di luar rentang yang diizinkan, atau jika tidak ada konversi dari jenis harfiah ke jenis target, kesalahan diposting (OLE DB) atau catatan diagnostik ODBC dihasilkan dengan SQLSTATE 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast". Untuk parameter tanggalwaktu dan smalldatetime, jika tahun berada di luar rentang dukungan jenis ini, kesalahan diposting (OLE DB) atau catatan diagnostik ODBC dihasilkan dengan SQLSATE 22007 dan pesan "Format tanggalwaktu tidak valid".

Untuk datetimeoffset, nilai harus dalam rentang setelah konversi ke UTC, bahkan jika tidak ada konversi ke UTC yang diminta. Ini karena TDS dan server selalu menormalkan waktu dalam nilai datetimeoffset untuk UTC, sehingga klien harus memverifikasi bahwa komponen waktu berada dalam rentang yang didukung setelah konversi ke UTC. Jika nilai tidak berada dalam rentang UTC yang didukung, kesalahan diposting (OLE DB), atau catatan diagnostik ODBC dihasilkan dengan SQLSTATE 22007 dan pesan "Format tanggalwaktu tidak valid".
10 Jika pemotongan dengan kehilangan data terjadi pada konversi klien ke server, kesalahan diposting (OLE DB) atau catatan diagnostik ODBC dihasilkan dengan SQLSTATE 22008 dan pesan "Meluap bidang Datetime". Kesalahan ini juga terjadi jika nilai berada di luar rentang yang dapat diwakili oleh rentang UTC yang digunakan oleh server. Jika pemotongan detik atau pecahan terjadi di server ke konversi klien, hanya ada peringatan.
11 Jika pemotongan dengan kehilangan data terjadi, rekaman diagnostik akan dihasilkan.

Pada konversi server-ke-klien, ini adalah peringatan (ODBC SQLSTATE S1000).

Pada konversi klien-ke-server, ini adalah kesalahan (ODBC SQLSTATE 22001).
12 Detik diatur ke nol dan detik pecahan dibuang. Tidak ada kesalahan pemotongan yang dimungkinkan.
T/A SQL Server 2005 (9.x) yang ada dan perilaku sebelumnya dipertahankan.

Lihat Juga

Peningkatan Tanggal dan Waktu (ODBC)
Peningkatan Tanggal dan Waktu (OLE DB)