Alterações de cópia em massa para tipos de data/hora aprimorados (OLE DB e ODBC)
Este tópico descreve os aprimoramentos de data/hora para oferecer suporte à funcionalidade de cópia em massa. As informações deste tópico são válidas para OLE DB e ODBC no SQL Server Native Client.
Arquivos de formato
Ao criar arquivos de formato interativamente, a tabela a seguir descreve a entrada usada para especificar os tipos de data/hora e os nomes de tipo de dados do arquivo de host correspondentes.
Tipo de armazenamento de arquivo |
Tipo de dados do arquivo host |
Resposta para o aviso: "Digite o tipo de armazenamento de arquivo do campo <nome_do_campo> [<padrão>]:" |
---|---|---|
Datetime |
SQLDATETIME |
d |
Smalldatetime |
SQLDATETIM4 |
D |
Data |
SQLDATE |
de |
Hora |
SQLTIME |
te |
Datetime2 |
SQLDATETIME2 |
d2 |
Datetimeoffset |
SQLDATETIMEOFFSET |
do |
O XSD do arquivo de formato XML terá as adições a seguir:
<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>
Arquivos de dados de caracteres
Em arquivos de dados de caracteres, os valores date e time são representados conforme descrito na seção sobre cadeias de caracteres e literais dos formatos de dados de Suporte a tipos de dados para aprimoramentos de data/hora do ODBC para ODBC ou de Suporte a tipos de dados para melhorias de data/hora do OLE DB para OLE DB.
Em arquivos de dados nativos, os valores date e time para os quatro novos tipos são mostrados como suas representações de TDS com uma escala de 7 (porque esse é o máximo com suporte no SQL Server e os arquivos de dados bcp não armazenam a escala dessas colunas). Não há nenhuma alteração ao armazenamento dos tipos datetime smalldatetime existentes ou em suas representações de protocolo TDS.
Os tamanhos de armazenamento para os diferentes tipos de armazenamento do OLE DB são estes:
Tipo de armazenamento de arquivo |
Tamanho de armazenamento em bytes |
---|---|
datetime |
8 |
smalldatetime |
4 |
date |
3 |
time |
6 |
datetime2 |
9 |
datetimeoffset |
11 |
Os tamanhos para o ODBC são mostrados a seguir. Observe que não é necessário armazenar a precisão nem nos arquivos de formato nem nos de dados, porque o BCP.exe sempre recuperará a precisão do servidor.
Tipo de armazenamento de arquivo |
Tamanho de armazenamento em bytes |
Formato de armazenamento |
---|---|---|
datetime (d) |
8 |
TDS |
smalldatetime (D) |
4 |
TDS |
date (de) |
3 |
TDS |
time (te) |
6 |
TDS |
datetime2 (d2) |
9 |
TDS |
datetimeoffset (do) |
11 |
TDS |
Tipos BCP em sqlncli.h
Os tipos a seguir são definidos em sqlncli.h para ser usados com as extensões de API BCP para ODBC. Esses tipos são passados com o parâmetro eUserDataType de IBCPSession::BCPColFmt no OLE DB.
Tipo de armazenamento de arquivo |
Tipo de dados do arquivo host |
Digite sqlncli.h para ser usado com IBCPSession::BCPColFmt |
Value |
---|---|---|---|
Datetime |
SQLDATETIME |
BCP_TYPE_SQLDATETIME |
0x3d |
Smalldatetime |
SQLDATETIM4 |
BCP_TYPE_SQLDATETIME4 |
0x3a |
Data |
SQLDATE |
BCP_TYPE_SQLDATE |
0x28 |
Hora |
SQLTIME |
BCP_TYPE_SQLTIME |
0x29 |
Datetime2 |
SQLDATETIME2 |
BCP_TYPE_SQLDATETIME2 |
0x2a |
Datetimeoffset |
SQLDATETIMEOFFSET |
BCP_TYPE_SQLDATETIMEOFFSET |
0x2b |
Conversões de tipo de dados BCP
As tabelas a seguir fornecem informações de conversão.
Observação do OLE DB As conversões a seguir são executadas por IBCPSession. IRowsetFastLoad usa conversões OLE DB conforme definido em Conversões executadas do cliente para o servidor. Observe que os valores datetime são arredondados para 1/300 de um segundo e os valores smalldatetime têm os segundos definidos como zero depois de concluídas as conversões de cliente descritas a seguir. O arredondamento de datetime se propaga para horas e minutos, mas não para a data.
Para --> De |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
char |
wchar |
---|---|---|---|---|---|---|---|---|
Data |
1 |
- |
1,6 |
1,6 |
1,6 |
1,5,6 |
1,3 |
1,3 |
Hora |
N/D |
1,10 |
1,7,10 |
1,7,10 |
1,7,10 |
1,5,7,10 |
1,3 |
1,3 |
Smalldatetime |
1,2 |
1,4,10 |
1 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime |
1,2 |
1,4,10 |
1,12 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime2 |
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 |
Char/wchar (date) |
9 |
- |
9,6 (ODBC)9,6,12 (OLE DB) |
9,6 (ODBC)9,6,12 (OLE DB) |
9,6 |
9,5,6 |
N/D |
N/D |
Char/wchar (time) |
- |
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 |
N/D |
N/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 |
N/D |
N/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 |
N/D |
N/D |
Legenda dos símbolos
Símbolo |
Significado |
||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- |
Não há suporte a nenhuma conversão. Será gerado um registro de diagnóstico de ODBC com SQLSTATE 07006 e a mensagem "Violação do atributo de tipo de dados restrito". |
||||||||||||||||||||||||||||||||
1 |
Se os dados fornecidos não forem válidos, um registro de diagnóstico de ODBC será gerado com SQLSTATE 22007 e a mensagem "Formato de datetime inválido". Para valores datetimeoffset, a parte time deve estar dentro do intervalo após a conversão em UTC, mesmo que nenhuma conversão em UTC seja solicitada. O motivo disso é que o TDS e o servidor sempre normalizam a hora em valores datetimeoffset para UTC. Por isso, o cliente deve verificar se os componentes time estão dentro do intervalo com suporte após a conversão em UTC. |
||||||||||||||||||||||||||||||||
2 |
O componente time é ignorado. |
||||||||||||||||||||||||||||||||
3 |
Para ODBC, se ocorrer o truncamento com a perda de dados, será gerado um registro de diagnóstico com SQLSTATE 22001 e a mensagem 'Dados de cadeia de caracteres truncados à direita'. O número de dígitos de segundos fracionais (a escala) é determinado pelo tamanho da coluna de destino de acordo com a tabela a seguir. Para tamanhos de coluna maiores do que o intervalo na tabela, é sugerida uma escala de 7. Essa conversão deve permitir até nove dígitos de segundos fracionários, o máximo permitido pelo ODBC.
Para OLE DB, se ocorrer o truncamento com a perda de dados, será postado um erro. Para datetime2, o número de dígitos de segundos fracionários (a escala) é determinado pelo tamanho da coluna de destino de acordo com a tabela a seguir. Para tamanhos de coluna maiores do que o intervalo na tabela, é sugerida uma escala de 9. Essa conversão deve permitir até nove dígitos de frações de segundo, o máximo permitido pelo OLE DB.
|
||||||||||||||||||||||||||||||||
4 |
O componente de data é ignorado. |
||||||||||||||||||||||||||||||||
5 |
O timezone é definido como UTC (por exemplo, 00:00). |
||||||||||||||||||||||||||||||||
6 |
A hora é definida como zero. |
||||||||||||||||||||||||||||||||
7 |
O componente date é definido como 1900-01-01. |
||||||||||||||||||||||||||||||||
8 |
O deslocamento de timezone é ignorado. |
||||||||||||||||||||||||||||||||
9 |
A cadeia de caracteres é analisada e convertida em um valor date, datetime, datetimeoffset ou time, dependendo do primeiro caractere de pontuação encontrado e da presença dos componentes restantes. A cadeia de caracteres é convertida no tipo de destino, seguindo as regras na tabela ao final deste tópico para o tipo de origem descoberto por esse processo. Se não for possível analisar sem erro os dados fornecidos ou se qualquer parte do componente estive fora do intervalo permitido ou ainda se não houver nenhuma conversão do tipo literal para o tipo de destino, será postado um erro (OLE DB) ou gerado um registro de diagnóstico de ODBC com SQLSTATE 22018 e a mensagem "Valor de caractere inválido para a especificação de difusão". Para os parâmetros datetime e smalldatetime, se o ano estiver fora do intervalo com suporte nesses tipos, será postado um erro (OLE DB) ou gerado um registro de diagnóstico de ODBC com SQLSATE 22007 e a mensagem "Formato de datetime inválido". Para datetimeoffset, o valor deve estar dentro do intervalo após a conversão em UTC, mesmo que nenhuma conversão em UTC seja solicitada. O motivo disso é que o TDS e o servidor sempre normalizam a hora em valores datetimeoffset para UTC, por isso o cliente deve verificar se os componentes time estão dentro do intervalo com suporte após a conversão em UTC. Se o valor não estiver dentro do intervalo UTC com suporte, será postado um erro (OLE DB) ou gerado um registro de diagnóstico de ODBC com SQLSTATE 22007 e a mensagem "Formato de datetime inválido". |
||||||||||||||||||||||||||||||||
10 |
Se ocorrer o truncamento com a perda de dados em uma conversão de cliente para servidor, será postado um erro (OLE DB) ou gerado um registro de diagnóstico de ODBC com SQLSTATE 22008 e a mensagem "Estouro no campo de data e hora". Esse erro também ocorrerá se o valor estiver fora do intervalo que pode ser representado pelo intervalo UTC usado pelo servidor. Se ocorrer o truncamento de segundos ou de segundos fracionários em uma conversão de cliente para servidor, somente um aviso será emitido. |
||||||||||||||||||||||||||||||||
11 |
Se ocorrer o truncamento com a perda de dados, será gerado um registro de diagnóstico. Em uma conversão de servidor para cliente, isso é uma advertência (ODBC SQLSTATE S1000). Em uma conversão de cliente para servidor, isso é um erro (ODBC SQLSTATE 22001). |
||||||||||||||||||||||||||||||||
12 |
Os segundos são definidos como zero e os segundos fracionários são descartados. Nenhum erro de truncamento é possível. |
||||||||||||||||||||||||||||||||
N/A |
O SQL Server 2005 existente e o comportamento anterior é mantido. |