CAST e CONVERT (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Essas funções convertem uma expressão de um tipo de dados em outro.

Sintaxe

CAST Sintaxe:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT Sintaxe:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Transact-SQL convenções de sintaxe

Argumentos

expressão

Qualquer expressão válida.

data_type

O tipo de dados de destino. Isso inclui xml, bigint e sql_variant. Os tipos de dados de alias não podem ser usados.

comprimento

Um inteiro opcional que especifica o comprimento do tipo de dados de destino, para tipos de dados que permitem um comprimento especificado pelo usuário. O valor padrão é 30.

estilo

Uma expressão inteira que especifica como a CONVERT função traduz expressão. Para um valor de estilo de NULL, NULL é devolvido. data_type determina o intervalo.

Tipos de devolução

Retorna expressão, traduzida para data_type.

Estilos de data e hora

Para uma expressão de tipo de dados de data ou hora, o estilo pode ter um dos valores mostrados na tabela a seguir. Outros valores são processados como 0. A partir do SQL Server 2012 (11.x), os únicos estilos suportados, ao converter de tipos de data e hora para datetimeoffset, são 0 ou 1. Todos os outros estilos de conversão retornam o erro 9809.

Observação

O Mecanismo de Banco de Dados do SQL Server suporta o formato de data, em estilo árabe, com o algoritmo kuwaitiano.

Sem século (aa) 1 Com século (aaaa) Standard Entrada/saída 3
- 0ou 1001,2 Padrão para datetime e smalldatetime MMM dd yyyy hh:mmtt (tt é AM ou PM)
1 101 EUA 1 = MM/dd/yy
101 = MM/dd/yyyy
2 102 ANSI (Instituto Nacional Americano de Normalização) 2 = yy.MM.dd
102 = yyyy.MM.dd
3 103 Britânico/Francês 3 = dd/MM/yy
103 = dd/MM/yyyy
4 104 Alemão 4 = dd.MM.yy
104 = dd.MM.yyyy
5 105 Italiano 5 = dd-MM-yy
105 = dd-MM-yyyy
6 106 1 - 6 = dd MMM yy
106 = dd MMM yyyy
7 107 1 - 7 = MMM dd, yy
107 = MMM dd, yyyy
8 ou 24 108 - HH:mm:ss
- 9ou 1091,2 Padrão + milissegundos MMM dd yyyy hh:mm:ss:ffftt (tt é AM ou PM)
10 110 EUA 10 = MM-dd-yy
110 = MM-dd-yyyy
11 111 Japão 11 = yy/MM/dd
111 = yyyy/MM/dd
12 112 ISO 12 = yyMMdd
112 = yyyyMMdd
- 13ou 1131,2 Padrão da Europa + milissegundos dd MMM yyyy HH:mm:ss:fff (24 horas)
14 114 - HH:mm:ss:fff (24 horas)
- 20 ou 1202 ODBC canônico yyyy-MM-dd HH:mm:ss (24 horas)
- 21ou 252121 Padrão canônico ODBC (com milissegundos) para time, date, datetime2 e datetimeoffset yyyy-MM-dd HH:mm:ss.fff (24 horas)
22 - EUA MM/dd/yy hh:mm:ss tt (tt é AM ou PM)
- 23 ISO8601 yyyy-MM-dd
- 126 4 ISO8601 yyyy-MM-ddTHH:mm:ss.fff (sem espaços) 6º
- 127 8, 9 ISO8601 com fuso horário Z yyyy-MM-ddTHH:mm:ss.fffZ (sem espaços) 6º
- 130 1,2 Hijri 5 dd MMMM yyyy hh:mm:ss:ffftt 7
- 131 2 Hijri 5 dd/MM/yyyy hh:mm:ss:ffftt

1 Esses valores de estilo retornam resultados não determinísticos. Inclui todos os estilos (yy) (sem século) e um subconjunto de estilos (yyyy) (com século).

2 Os valores padrão (0 ou 100, 9 ou 109, 13 ou 113, ou , 20 ou 120, 23, ou 2125 ou 121) devolvem sempre o século (yyyy).

Importante

Por defeito, o Mecanismo de Banco de Dados do SQL Server interpreta anos de dois dígitos com base num ano limite de 2049. Isto significa que o Database Engine interpreta o ano 49 de dois dígitos como 2049 e o ano 50 de dois dígitos como 1950. Muitos aplicativos cliente, incluindo aqueles baseados em objetos de automação, usam um ano de corte de 2030. O Database Engine fornece a opção de configuração do ano de corte de dois dígitos para alterar o ano de corte utilizado pelo Database Engine. Isso permite o tratamento consistente das datas. Recomendamos especificar anos de quatro dígitos.

3 Entrada quando você converte para datetime; quando você converte em dados de caracteres.

4 Projetado para uso XML. Para converter de datetime ou smalldatetime em dados de caracteres, consulte a tabela anterior para o formato de saída.

5 Hijri é um sistema de calendário com várias variações. O Database Engine utiliza o algoritmo kuwaitiano.

6 Para um valor de milissegundos (fff) de 0, o valor da fração decimal de milissegundos não será exibido. Por exemplo, o valor 2022-11-07T18:26:20.000 é exibido como 2022-11-07T18:26:20.

7 Neste estilo, MMMM representa uma representação multi-token Hijri Unicode do nome completo do mês. Esse valor não é renderizado corretamente em uma instalação padrão do SSMS nos EUA.

8 Suportado apenas durante a transmissão de dados de caracteres para datetime ou smalldatetime. Ao transmitir dados de caracteres que representam apenas componentes de data ou hora para os tipos de dados datetime ou smalldatetime , o componente de hora não especificada é definido como 00:00:00.000, e o componente de data não especificada é definido como 1900-01-01.

9 Use o indicador Z opcional de fuso horário para facilitar o mapeamento de valores data-hora XML que contenham informação de fuso horário para valores de data-hora do Database Engine que não têm fuso horário. Z indica fuso horário em UTC-0. O HH:mm deslocamento, na direção ou + indica, outros fusos - horários. Por exemplo: 2022-12-12T23:45:12-08:00.

Ao converter smalldatetime em dados de caracteres, os estilos que incluem segundos ou milissegundos mostram zeros nessas posições. Ao converter de valores datetime ou smalldatetime , use um comprimento de tipo de dados char ou varchar apropriado para truncar partes de data indesejadas.

Ao converter dados de caractere em datetimeoffset, usando um estilo que inclui uma hora, um deslocamento de fuso horário é anexado ao resultado.

flutuar e estilos reais

Para uma expressão flutuante ou real, o estilo pode ter um dos valores mostrados na tabela a seguir. Outros valores são processados como 0.

Valor Resultado
0 (predefinição) Um máximo de 6 dígitos. Utilização em notação científica, quando apropriado.
1 Sempre 8 dígitos. Use sempre em notação científica.
2 Sempre 16 dígitos. Use sempre em notação científica.
3 Sempre 17 dígitos. Use para conversão sem perdas. Com esse estilo, cada flutuador distinto ou valor real é garantido para converter em uma cadeia de caracteres distinta.

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores e Banco de Dados SQL do Azure.
126, 128, 129 Incluído por razões hereditárias. Não use esses valores para novos desenvolvimentos.

Estilos de dinheiro e dinheiro pequeno

Para uma expressãomoney ou smallmoney, o estilo pode ter um dos valores mostrados na tabela a seguir. Outros valores são processados como 0.

Valor Resultado
0 (predefinição) Sem vírgulas a cada três dígitos à esquerda da vírgula decimal e dois dígitos à direita da vírgula decimal

Exemplo: 4235.98.
1 Vírgulas a cada três dígitos à esquerda da vírgula decimal e dois dígitos à direita da vírgula decimal

Exemplo: 3.510,92.
2 Sem vírgulas a cada três dígitos à esquerda da vírgula decimal e quatro dígitos à direita da vírgula decimal

Exemplo: 4235.9819.
126 Equivalente ao estilo 2, ao converter para char(n) ou varchar(n)

Estilos XML

Para uma expressãoxml, o estilo pode ter um dos valores mostrados na tabela a seguir. Outros valores são processados como 0.

Valor Resultado
0 (predefinição) Use o comportamento de análise padrão que descarta espaço em branco insignificante e não permite um subconjunto DTD interno.

Nota: Ao converter para o tipo de dados xml, o Database Engine gere espaços em branco insignificantes de forma diferente do XML 1.0. Para mais informações, veja Criar instâncias de dados XML.
1 Preserve espaços em branco insignificantes. Esta definição de estilo define o tratamento predefinido xml:space para corresponder ao comportamento do xml:space="preserve".
2 Habilite o processamento limitado de subconjuntos DTD internos.

Se habilitado, o servidor pode usar as seguintes informações fornecidas em um subconjunto DTD interno para executar operações de análise não validantes.

- Padrões para atributos são aplicados
- As referências de entidades internas são resolvidas e expandidas
- O modelo de conteúdo DTD é verificado quanto à correção sintática

O analisador ignora subconjuntos DTD externos. Além disso, não avalia a declaração XML para ver se o atributo autónomo tem um yes valor ou no . Em vez disso, ele analisa a instância XML como um documento autônomo.
3 Preserve espaços em branco insignificantes e habilite o processamento limitado de subconjuntos DTD internos.

Estilos binários

Para uma expressão binary(n), char(n), varbinary(n) ou varchar(n), o estilo pode ter um dos valores mostrados na tabela a seguir. Valores de estilo não listados na tabela devolvem um erro.

Valor Resultado
0 (predefinição) Traduz caracteres ASCII para bytes binários ou bytes binários para caracteres ASCII. Cada caractere ou byte é convertido 1:1.

Para um data_type binário, os caracteres 0x são adicionados à esquerda do resultado.
1, 2 Para uma data_type binária, a expressão deve ser uma expressão de caractere. A expressão deve ter um número par de dígitos hexadecimais (0, 1, 2, 43, 5, 6, 7, , 8, AecfdbaECF9BD). Se o estilo for definido para 1, a expressão deve ter 0x como os dois primeiros caracteres. Se a expressão contiver um número ímpar de caracteres ou se algum dos caracteres for inválido, um erro será gerado.

Se o comprimento da expressão convertida exceder o comprimento do data_type, o resultado será truncado à direita.

O comprimento fixo data_types maior que o resultado convertido tem zeros adicionados à direita do resultado.

Um data_type de caractere de tipo requer uma expressão binária. Cada caractere binário é convertido em dois caracteres hexadecimais. Suponha que o comprimento da expressão convertida exceda o comprimento do data_type. Nesse caso, é truncado.

Para um tipo de caractere de tamanho fixo data_type, se o comprimento do resultado convertido for menor do que o comprimento do data_type, espaços serão adicionados à direita da expressão convertida para manter um número par de dígitos hexadecimais.

Os caracteres 0x não são adicionados à esquerda do resultado convertido para dar estilo2.

Conversões implícitas

As conversões implícitas não requerem especificação CAST da função ou da CONVERT função. Conversões explícitas requerem a CAST especificação da função ou da CONVERT função. A ilustração seguinte mostra todas as conversões explícitas e implícitas de tipos de dados permitidas para os tipos de dados fornecidos pelo Database Engine do sistema. Estas incluem bigint, sql_variant, xml, hierarchyid, geography, geometry, json e vector. Os tipos de dados json e vector estão disponíveis apenas no SQL Server 2025 (17.x), Base de Dados SQL do Azure, Azure SQL Managed Instance e base de dados SQL no Microsoft Fabric. Não há conversão implícita na atribuição a partir do tipo de dado sql_variant , mas há conversão implícita para sql_variant.

Diagrama que mostra quais as conversões entre tipos de dados do SQL Server que são explícitas, implícitas ou não permitidas, incluindo os tipos de dados hierárquico, geografia, geometria, json e vetorial.

O gráfico acima ilustra todas as conversões explícitas e implícitas permitidas no Database Engine, mas o tipo de dado resultante da conversão depende da operação que está a ser realizada:

  • Para conversões explícitas, a própria instrução determina o tipo de dados resultante.
  • Para conversões implícitas, instruções de atribuição, como definir o valor de uma variável ou inserir um valor em uma coluna, resultam no tipo de dados que foi definido pela declaração de variável ou definição de coluna.
  • Para operadores de comparação ou outras expressões, o tipo de dados resultante depende das regras de precedência do tipo de dados.

Para alguns tipos de dados, o resultado depende de como o tipo de dados é declarado:

  • Decimal e numérico: O Database Engine trata cada combinação de precisão e escala como um tipo de dado diferente. A conversão entre eles pode ser implícita. Um valor com mais casas decimais do que a escala alvo é arredondado sem erro. Um valor demasiado grande para a precisão do alvo causa o erro 8115, a menos que ARITHABORT e sejam ambos OFF; então o resultado é NULLANSI_WARNINGS .
  • Não podes converter varchar(max),nvarchar(max) e varbinary(max) para sql_variant.
  • Não é permitida a conversão entre diferentes tipos de CLR definidos pelo utilizador.
  • A conversão implícita é suportada entre xml não tipado e xml tipado, e entre valores xml tipados que utilizam a mesma coleção de esquemas XML e a mesma DOCUMENT faceta.CONTENT
  • A conversão entre diferentes coleções de esquemas XML, ou entre diferentes DOCUMENT facetas, CONTENT deve ser explícita. A conversão entre um tipo CLR definido pelo utilizador e um xml tipado não é permitida.
  • A conversão entre valores vetoriais só é permitida quando as dimensões e o tipo base (float32 ou float16) são iguais.

Uma conversão que o gráfico mostra como permitida pode ainda falhar para um valor específico, por exemplo, uma cadeia que não é JSON válida, ou um vetor com um número diferente de dimensões. Os valores dos tipos de dados imagem, ntext, texto, xml, geografia, geometria, json e vector não podem ser comparados com o operador igual a (=), mesmo quando ambos os valores têm o mesmo tipo de dado.

Sugestão

Um exemplo prático sobre os efeitos da precedência do tipo de dados em conversões pode ser visto mais adiante nesta seção.

Quando você converte entre datetimeoffset e os tipos de caractere char, nchar, nvarchar e varchar, a parte de deslocamento de fuso horário convertida sempre deve ter dois dígitos para ambos e . HHmm Por exemplo, -08:00.

Os tipos de dados nchar e nvarchar armazenam dados Unicode em codificação UTF-16, que utiliza sempre um número par de bytes. Tenha cuidado ao converter binário ou varbinário para ou de nchar ou nvarchar. Por exemplo, a conversão seguinte não retorna um valor hexadecimal de 41. Devolve um valor hexadecimal de 4100:

SELECT CAST (CAST (0x41 AS NVARCHAR) AS VARBINARY);

Para obter mais informações, consulte Classificação e suporte a Unicode.

Tipos de dados de grande valor

Os tipos de dados de grande valor têm o mesmo comportamento de conversão implícito e explícito que seus homólogos menores - especificamente, os tipos de dados nvarchar, varbinary e varchar . No entanto, considere as seguintes diretrizes:

  • A conversão de imagem para varbinary(max), e vice-versa, opera como uma conversão implícita, assim como as conversões entre texto e varchar(max), e ntext e nvarchar(max).
  • A conversão de tipos de dados de valor grande, como varchar(max), para um tipo de dados de contrapartida menor, como varchar, é uma conversão implícita, mas o truncamento ocorre se o tamanho do valor grande exceder o comprimento especificado do tipo de dados menor.
  • A conversão de nvarchar, varbinary ou varchar para seus tipos de dados de grande valor correspondentes acontece implicitamente.
  • A conversão do tipo de dados sql_variant para os tipos de dados de grande valor é uma conversão explícita.
  • Tipos de dados de grande valor não podem ser convertidos para o tipo de dados sql_variant .

Para mais informações sobre conversão a partir do tipo de dado xml , consulte Criar instâncias de dados XML.

Tipo de dados XML

Quando você converte explícita ou implicitamente o tipo de dados xml em uma cadeia de caracteres ou tipo de dados binário, o conteúdo do tipo de dados xml é serializado com base em um conjunto definido de regras. Para informações sobre estas regras, veja Definir a serialização de dados XML. Para informações sobre a conversão de outros tipos de dados para o tipo de dados xml , veja Criar instâncias de dados XML.

Tipos de dados de texto e imagem

Os tipos de dados de texto e imagem não suportam a conversão automática de tipos de dados. Você pode converter explicitamente dados de texto em dados de caracteres e dados de imagem em binários ou varbinary, mas o comprimento máximo é de 8000 bytes. Se tentar uma conversão incorreta, por exemplo tentar converter uma expressão de carácter que inclui letras para int, o Database Engine devolve uma mensagem de erro.

Agrupamento de saída

Quando as CAST funções ou CONVERT produzem uma cadeia de caracteres e recebem uma entrada de cadeia de caracteres, a saída tem o mesmo rótulo de agrupamento e agrupamento que a entrada. Se a entrada não for uma cadeia de caracteres, a saída terá o agrupamento padrão do banco de dados e um rótulo de agrupamento de padrão coercível. Para obter mais informações, consulte Precedência de agrupamento.

Para atribuir uma colação diferente à saída, aplique a COLLATE cláusula à expressão de resultado da CAST função ou CONVERT . Por exemplo:

SELECT CAST ('abc' AS VARCHAR (5)) COLLATE French_CS_AS;

Resultados de truncamento e arredondamento

Ao converter expressões binárias ou de caracteres (binary, char, nchar, nvarchar, varbinary ou varchar) em uma expressão de um tipo de dados diferente, a operação de conversão pode truncar os dados de saída, exibir apenas parcialmente os dados de saída ou retornar um erro. Estes casos ocorrem se o resultado for demasiado curto para ser exibido. As conversões para binário, char, nchar, nvarchar, varbinário ou varchar são truncadas, exceto para as conversões mostradas na tabela a seguir.

Do tipo de dados Para o tipo de dados Resultado
int, smallint ou tinyint char
Varchar
Demasiado curto para ser apresentado
Nchar
Nvarchar
Erro 1
dinheiro, dinheiro pequeno, numérico, decimal, flutuante ou real char
Varchar
Erro 1
Nchar
Nvarchar
Erro 1

1 Erro retornado porque o comprimento do resultado é muito curto para ser exibido.

O Mecanismo de Banco de Dados do SQL Server garante que apenas as conversões de ida e volta, ou seja, as conversões que convertem um tipo de dado do seu tipo original e vice-versa, produzem os mesmos valores de versão para versão. O exemplo a seguir mostra essa conversão de ida e volta:

DECLARE @myval AS DECIMAL (5, 2);
SET @myval = 193.57;

SELECT CAST (CAST (@myval AS VARBINARY (20)) AS DECIMAL (10, 5));

-- Or, using CONVERT
SELECT CONVERT (DECIMAL (10, 5), CONVERT (VARBINARY (20), @myval));
GO

Advertência

Não construa valores binários e, em seguida, converta-os em um tipo de dados da categoria de tipo de dados numéricos. O Database Engine não garante que o resultado de uma conversão de tipo de dado decimal ou numérico, para binário, seja o mesmo entre versões do SQL Server.

O exemplo a seguir mostra uma expressão resultante que é muito pequena para ser exibida.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       SUBSTRING(p.Title, 1, 25) AS Title,
       CAST (e.SickLeaveHours AS CHAR (1)) AS [Sick Leave]
FROM HumanResources.Employee AS e
     INNER JOIN Person.Person AS p
         ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID > 5;
GO

Aqui está o conjunto de resultados.

FirstName   LastName      Title   Sick Leave
---------   ------------- ------- --------`
Ken         Sanchez       NULL   *
Terri       Duffy         NULL   *
Roberto     Tamburello    NULL   *
Rob         Walters       NULL   *
Gail        Erickson      Ms.    *

Quando converte tipos de dados que diferem em casas decimais, o Database Engine por vezes devolve um valor de resultado truncado e, noutras ocasiões, devolve um valor arredondado. Esta tabela mostra o comportamento.

De Para Comportamento
numérico numérico Rodada
numérico Int Truncar
numérico dinheiro Rodada
dinheiro Int Rodada
dinheiro numérico Rodada
flutuar Int Truncar
flutuar numérico 1ª Rodada
flutuar datetime Rodada
datetime Int Rodada

1 A conversão de valores flutuantes que usam notação científica para decimal ou numérica é restrita a valores de precisão de 17 dígitos apenas. Qualquer valor com precisão superior a 17 arredondamentos para zero.

Por exemplo, os valores 10.6496 e -10.6496 podem ser truncados ou arredondados durante a conversão para tipos int ou numéricos :

SELECT CAST (10.6496 AS INT) AS trunc1,
       CAST (-10.6496 AS INT) AS trunc2,
       CAST (10.6496 AS NUMERIC) AS round1,
       CAST (-10.6496 AS NUMERIC) AS round2;

Os resultados da consulta são mostrados na tabela a seguir:

trunc1 trunc2 Ronda1 2ª Rodada
10 -10 11 -11

Ao converter tipos de dados em que o tipo de dados de destino tem menos casas decimais do que o tipo de dados de origem, o valor é arredondado. Por exemplo, esta conversão devolve $10.3497:

SELECT CAST (10.3496847 AS MONEY);

O Database Engine devolve uma mensagem de erro ao converter dados não numéricos de char, nchar, nvarchar ou varchar para decimal, float, int, numérico. O Database Engine também devolve um erro quando uma cadeia vazia ( ) é convertida em numérico ou decimal.

Certas conversões de data/hora são não determinísticas

Os estilos para os quais a conversão string-to-datetime é não-determinística são os seguintes:

  • Todos os estilos abaixo 100de 1
  • 106
  • 107
  • 109
  • 113
  • 130

1 Com exceção dos estilos 20 e 21

Para obter mais informações, consulte Conversão não determinística de cadeias literais de data em valores DATE.

Caracteres suplementares (pares substitutos)

A partir do SQL Server 2012 (11.x), ao usar agrupamentos de caracteres suplementares (SC), uma CAST operação de nchar ou nvarchar para um tipo nchar ou nvarchar de comprimento menor não será truncada dentro de um par substituto. Em vez disso, a operação trunca antes do caractere suplementar. Por exemplo, o fragmento de código a seguir deixa @x segurando apenas ab. Não há espaço suficiente para manter o caráter suplementar.

DECLARE @x AS NVARCHAR (10) = 'ab' + NCHAR(0x10000);

SELECT CAST (@x AS NVARCHAR (3));

Ao usar agrupamentos SC, o comportamento de CONVERT, é análogo ao de CAST. Para obter mais informações, consulte Suporte a agrupamento e Unicode - caracteres suplementares.

Suporte de compatibilidade

Em versões anteriores do SQL Server, o estilo padrão para CAST e CONVERT operações nos tipos de dados time e datetime2 é 121, exceto quando qualquer um dos tipos é usado numa expressão de coluna computada. Para colunas calculadas, o estilo padrão é 0. Este comportamento afeta as colunas calculadas quando são criadas, usadas em consultas que envolvem autoparametrização ou em definições de restrições.

Sob nível 110de compatibilidade e superiores, as CAST operações e CONVERT nos tipos de dados time e datetime2 têm 121 sempre como estilo padrão. Se uma consulta se basear no comportamento antigo, use um nível de compatibilidade inferior a 110, ou especifique explicitamente o 0 estilo na consulta afetada.

Valor do nível de compatibilidade Estilo padrão para CAST e CONVERT1 Estilo padrão para coluna computada
< 110 121 0
>= 110 121 121

1 Exceto colunas computadas

Atualizar a base de dados para um nível 110 de compatibilidade ou superior não altera os dados do utilizador que foram armazenados no disco. Você deve corrigir manualmente esses dados conforme apropriado. Por exemplo, se usasse SELECT INTO para criar uma tabela a partir de uma fonte contendo uma expressão de coluna computada descrita acima, os dados (usando o estilo 0) seriam armazenados em vez da própria definição da coluna computada. Deve atualizar manualmente estes dados para corresponder ao estilo 121.

Exemplos

Os exemplos de código neste artigo utilizam a AdventureWorks2025, AdventureWorksDW2025, ou AdventureWorksLT2025 base de dados de exemplos, que pode descarregar do repositório GitHub do Azure Data SQL Samples Repository.

Um. Use CAST e CONVERT

Estes exemplos recuperam o nome do produto, para os produtos que têm um 3 como o primeiro dígito do preço de tabela, e converte seus ListPrice valores em int.

Utilize CAST:

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CAST (ListPrice AS INT) LIKE '33%';
GO

Utilize CONVERT:

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CONVERT (INT, ListPrice) LIKE '33%';
GO

Aqui está o conjunto de resultados. O conjunto de resultados da amostra é o mesmo para ambos e CASTCONVERT.

ProductName                    ListPrice
------------------------------ ---------------------
LL Road Frame - Black, 58      337.22
LL Road Frame - Black, 60      337.22
LL Road Frame - Black, 62      337.22
LL Road Frame - Red, 44        337.22
LL Road Frame - Red, 48        337.22
LL Road Frame - Red, 52        337.22
LL Road Frame - Red, 58        337.22
LL Road Frame - Red, 60        337.22
LL Road Frame - Red, 62        337.22
LL Road Frame - Black, 44      337.22
LL Road Frame - Black, 48      337.22
LL Road Frame - Black, 52      337.22
Mountain-100 Black, 38         3374.99
Mountain-100 Black, 42         3374.99
Mountain-100 Black, 44         3374.99
Mountain-100 Black, 48         3374.99
HL Road Front Wheel            330.06
LL Touring Frame - Yellow, 62  333.42
LL Touring Frame - Blue, 50    333.42
LL Touring Frame - Blue, 54    333.42
LL Touring Frame - Blue, 58    333.42
LL Touring Frame - Blue, 62    333.42
LL Touring Frame - Yellow, 44  333.42
LL Touring Frame - Yellow, 50  333.42
LL Touring Frame - Yellow, 54  333.42
LL Touring Frame - Yellow, 58  333.42
LL Touring Frame - Blue, 44    333.42
HL Road Tire                   32.60

B. Usar CAST com operadores aritméticos

Este exemplo calcula um cálculo de coluna única (Computed) dividindo o total de vendas do ano até a data (SalesYTD) pela porcentagem de comissão (CommissionPCT). Esse valor é arredondado para o número inteiro mais próximo e, em seguida, CAST para um tipo de dados int .

USE AdventureWorks2025;
GO

SELECT CAST (ROUND(SalesYTD / CommissionPCT, 0) AS INT) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

Aqui está o conjunto de resultados.

Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

C. Use CAST para concatenar

Este exemplo concatena expressões sem caracteres usando CAST. Utiliza a AdventureWorksDW2025 base de dados.

SELECT 'The list price is ' + CAST (ListPrice AS VARCHAR (12)) AS ListPrice
FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;

Aqui está o conjunto de resultados.

ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

D. Use CAST para produzir texto mais legível

Este exemplo é usado CAST na SELECT lista para converter a Name coluna numa coluna char(10). Utiliza a AdventureWorksDW2025 base de dados.

SELECT DISTINCT CAST (EnglishProductName AS CHAR (10)) AS Name,
                ListPrice
FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';
GO

Aqui está o conjunto de resultados.

Name        ListPrice
----------  ---------
Long-Sleev  31.2437
Long-Sleev  32.4935
Long-Sleev  49.99

E. Use CAST com a cláusula LIKE

Este exemplo converte os valores de money coluna SalesYTD em tipo de dados int e, em seguida, em tipo de dados char(20), para que a LIKE cláusula possa usá-lo.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       s.SalesYTD,
       s.BusinessEntityID
FROM Person.Person AS p
     INNER JOIN Sales.SalesPerson AS s
         ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST (CAST (s.SalesYTD AS INT) AS CHAR (20)) LIKE '2%';
GO

Aqui está o conjunto de resultados.

FirstName        LastName            SalesYTD         BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi             Reiter              2811012.7151      279
Syed             Abbas               219088.8836       288
Rachel           Valdez              2241204.0424      289

F. Usar CONVERT ou CAST com XML digitado

Estes exemplos mostram a utilização de CONVERT para converter dados em XML tipado, utilizando o tipo de dado e as colunas XML (SQL Server).

Este exemplo converte uma cadeia de caracteres com espaço em branco, texto e marcação em XML digitado e remove todo o espaço em branco insignificante (espaço em branco limite entre nós):

SELECT CONVERT (XML, '<root><child/></root>');

Este exemplo converte uma cadeia de caracteres semelhante com espaço em branco, texto e marcação em XML digitado e preserva espaço em branco insignificante (espaço em branco limite entre nós):

SELECT CONVERT (XML, '<root>          <child/>         </root>', 1);

Este exemplo converte uma cadeia de caracteres com espaço em branco, texto e marcação em XML digitado:

SELECT CAST ('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML);

Consulte Criar instâncias de dados XML para mais exemplos.

G. Use CAST e CONVERT com dados datetime

Começando com GETDATE() valores, este exemplo exibe a data e a hora atuais, usa CAST para alterar a data e a hora atuais para um tipo de dados de caractere e, em seguida, usa CONVERT para exibir a data e a hora no ISO 8601 formato.

SELECT GETDATE() AS UnconvertedDateTime,
       CAST (GETDATE() AS NVARCHAR (30)) AS UsingCast,
       CONVERT (NVARCHAR (30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO

Aqui está o conjunto de resultados.

UnconvertedDateTime     UsingCast              UsingConvertTo_ISO8601
----------------------- ---------------------- ------------------------------
2022-04-18 09:58:04.570 Apr 18 2022  9:58AM    2022-04-18T09:58:04.570

Este exemplo é aproximadamente o oposto do exemplo anterior. Este exemplo exibe uma data e hora como dados de caracteres, usa CAST para alterar os dados de caractere para o tipo de dados datetime e, em seguida, usa CONVERT para alterar os dados de caractere para o tipo de dados datetime .

SELECT '2006-04-25T15:50:59.997' AS UnconvertedText,
       CAST ('2006-04-25T15:50:59.997' AS DATETIME) AS UsingCast,
       CONVERT (DATETIME, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601;
GO

Aqui está o conjunto de resultados.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

H. Use CONVERT com dados binários e de caracteres

Estes exemplos mostram os resultados da conversão de dados binários e de caracteres, usando estilos diferentes.

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT (CHAR (8), 0x4E616d65, 0) AS [Style 0, binary to character];

Aqui está o conjunto de resultados.

Style 0, binary to character
----------------------------
Name

Este exemplo mostra que o Estilo 1 pode forçar o truncamento do resultado. Os caracteres 0x no conjunto de resultados forçam o truncamento.

SELECT CONVERT (CHAR (8), 0x4E616d65, 1) AS [Style 1, binary to character];

Aqui está o conjunto de resultados.

Style 1, binary to character
------------------------------
0x4E616D

Este exemplo mostra que Style 2 não trunca o resultado, porque o resultado não inclui os caracteres 0x.

SELECT CONVERT (CHAR (8), 0x4E616d65, 2) AS [Style 2, binary to character];

Aqui está o conjunto de resultados.

Style 2, binary to character
------------------------------
4E616D65

Converte o valor Name do carácter para um valor binário.

SELECT CONVERT (BINARY (8), 'Name', 0) AS [Style 0, character to binary];

Aqui está o conjunto de resultados.

Style 0, character to binary
----------------------------
0x4E616D6500000000
SELECT CONVERT (BINARY (4), '0x4E616D65', 1) AS [Style 1, character to binary];

Aqui está o conjunto de resultados.

Style 1, character to binary
----------------------------
0x4E616D65
SELECT CONVERT (BINARY (4), '4E616D65', 2) AS [Style 2, character to binary];

Aqui está o conjunto de resultados.

Style 2, character to binary
----------------------------------
0x4E616D65

Eu. Converter tipos de dados de data e hora

Este exemplo mostra a conversão dos tipos de dados date, time e datetime .

DECLARE @d1 AS DATE,
        @t1 AS TIME,
        @dt1 AS DATETIME;

SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();

-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS DATE,
       CAST (@d1 AS DATETIME) AS [date as datetime];

-- When converting time to datetime the date portion becomes zero
-- which converts to January 1, 1900.
SELECT @t1 AS TIME,
       CAST (@t1 AS DATETIME) AS [time as datetime];

-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS DATETIME,
       CAST (@dt1 AS DATE) AS [datetime as date],
       CAST (@dt1 AS TIME) AS [datetime as time];

Verifique se os valores estão dentro de um intervalo compatível ao considerar uma conversão de date para datetime ou datetime2. O valor mínimo de ano para datetime é 1753, enquanto o valor mínimo de year é 0001 para date e datetime2.

DECLARE @d1 AS DATE,
        @dt1 AS DATETIME,
        @dt2 AS DATETIME2;

SET @d1 = '1492-08-03';
--This is okay; Minimum YYYY for DATE is 0001

SET @dt2 = CAST (@d1 AS DATETIME2);
--This is okay; Minimum YYYY for DATETIME2 IS 0001

SET @dt1 = CAST (@d1 AS DATETIME);
--This returns an error with (Msg 242) "The conversion of a date data type to a datetime data type resulted in an out-of-range value."
--Minimum YYYY for DATETIME is 1753

J. Use CONVERT com dados datetime em diferentes formatos

Começando com GETDATE() valores, este exemplo usa CONVERT para exibir todos os estilos de data e hora na seção Estilos de data e hora deste artigo.

Formato # Exemplo de consulta Resultado da amostra
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) Ago 23, 2019 13:39PM
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 23 ago 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 23 de agosto de 19
8 ou 24 ou 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 ou 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 23 de agosto de 2019 13:39:17:090
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 ou 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 ago 2019 13:39:17:090
14 ou 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 ou 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 ou 25 ou 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 23/08/19 13:39:17
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23 ago 2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) Ago 23, 2019
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 ago 2019 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.090
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.090
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحجة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22/12/1440 13:39:17.090PM

K. Efeitos da precedência do tipo de dados nas conversões permitidas

O exemplo a seguir define uma variável do tipo varchar(10), atribui um valor inteiro à variável e, em seguida, seleciona uma concatenação da variável com uma cadeia de caracteres.

DECLARE @string AS VARCHAR (10);
SET @string = 1;

SELECT @string + ' is a string.' AS Result;

Aqui está o conjunto de resultados.

Result
-----------------------
1 is a string.

O valor int de 1 foi convertido em varchar.

Este exemplo mostra uma consulta semelhante, usando uma variável int :

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + ' is not a string.' AS Result;

Nesse caso, a SELECT instrução lança o seguinte erro:

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.

Para avaliar a expressão @notastring + ' is not a string.', o Database Engine precisa de seguir as regras de precedência de tipos de dados para completar a conversão implícita antes de o resultado da expressão poder ser calculado. Como o int tem precedência superior ao varchar, o Database Engine tenta converter a cadeia para inteiro e falha porque essa cadeia não pode ser convertida em inteiro.

Se fornecermos uma cadeia que pode ser convertida, a afirmação tem sucesso, como se vê no seguinte exemplo:

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + '1';

Nesse caso, a cadeia de caracteres '1' pode ser convertida para o valor 1inteiro , portanto, esta SELECT instrução retorna o valor 2. Quando os tipos de dados fornecidos são inteiros, o + operador torna-se operador matemático de adição, em vez de uma concatenação de strings.

Exemplos: Azure Synapse Analytics

L. Usar CAST e CONVERT

Este exemplo recupera o nome do produto para os produtos que têm um 3 no primeiro dígito de seu preço de tabela e converte o ListPrice desses produtos em int. Utiliza a AdventureWorksDW2025 base de dados.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (ListPrice AS INT) LIKE '3%';

Este exemplo mostra a mesma consulta, usando CONVERT em vez de CAST. Utiliza a AdventureWorksDW2025 base de dados.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CONVERT (INT, ListPrice) LIKE '3%';

M. Usar CAST com operadores aritméticos

Este exemplo calcula um valor de coluna única dividindo o preço unitário do produto (UnitPrice) pela porcentagem de desconto (UnitPriceDiscountPct). Este resultado é então arredondado para o número inteiro mais próximo e, finalmente, convertido para um tipo de dados int . Este exemplo usa o AdventureWorksDW2025 banco de dados.

SELECT ProductKey,
       UnitPrice,
       UnitPriceDiscountPct,
       CAST (ROUND(UnitPrice * UnitPriceDiscountPct, 0) AS INT) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
      AND UnitPriceDiscountPct > .02;

Aqui está o conjunto de resultados.

ProductKey  UnitPrice  UnitPriceDiscountPct  DiscountPrice
----------  ---------  --------------------  -------------
323         430.6445   0.05                  22
213         18.5043    0.05                  1
456         37.4950    0.10                  4
456         37.4950    0.10                  4
216         18.5043    0.05                  1

N. Use CAST com a cláusula LIKE

Este exemplo converte a colunaListPrice do dinheiro para um tipo int , e depois para um tipo char(20 ), para que a LIKE cláusula possa usá-la. Este exemplo usa o AdventureWorksDW2025 banco de dados.

SELECT EnglishProductName AS Name,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (CAST (ListPrice AS INT) AS CHAR (20)) LIKE '2%';

O. Use CAST e CONVERT com dados datetime

Este exemplo exibe a data e a hora atuais, usa CAST para alterar a data e a hora atuais para um tipo de dados de caractere e, finalmente, usa CONVERT exibir a data e a hora no formato ISO 8601. Este exemplo usa o AdventureWorksDW2025 banco de dados.

SELECT TOP (1) SYSDATETIME() AS UnconvertedDateTime,
               CAST (SYSDATETIME() AS NVARCHAR (30)) AS UsingCast,
               CONVERT (NVARCHAR (30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;

Aqui está o conjunto de resultados.

UnconvertedDateTime     UsingCast                     UsingConvertTo_ISO8601
---------------------   ---------------------------   ---------------------------
07/20/2010 1:44:31 PM   2010-07-20 13:44:31.5879025   2010-07-20T13:44:31.5879025

Este exemplo é o oposto do exemplo anterior. Este exemplo exibe uma data e hora como dados de caracteres, usa CAST para alterar os dados de caractere para o tipo de dados datetime e, em seguida, usa CONVERT para alterar os dados de caractere para o tipo de dados datetime . Este exemplo usa o AdventureWorksDW2025 banco de dados.

SELECT TOP (1) '2010-07-25T13:50:38.544' AS UnconvertedText,
               CAST ('2010-07-25T13:50:38.544' AS DATETIME) AS UsingCast,
               CONVERT (DATETIME, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601
FROM dbo.DimCustomer;

Aqui está o conjunto de resultados.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM   07/25/2010 1:50:38 PM