Tipos de dados CLR grandes definidos pelo usuário (ODBC)

 

Publicado: dezembro de 2016

Este tópico aborda as alterações feitas ao ODBC no SQL Server Native Client para dar suporte aos UDTs (tipos definidos pelo usuário) de CLR (Common Language Runtime) grande.

Para obter um exemplo mostrando o suporte a ODBC para UDTs grandes do CLR, consulte suporte para UDTs grandes.

Para obter mais informações sobre o suporte para UDTs grandes do CLR no SQL Server Native Client, consulte Large CLR User-Defined tipos.

O SQL Server Native Client usa SQL_SS_LENGTH_UNLIMITED para indicar que o tamanho de uma coluna é maior que 8.000 bytes para tipos LOB. A partir do SQL Server 2008, o mesmo valor é usado para UDTs do CLR quando seu tamanho for maior que 8.000 bytes.

Os valores UDT são representados como matrizes de bytes. Há suporte para conversões de cadeias hexadecimais e para cadeias hexadecimais. Os valores literais são representados como cadeias de caracteres hexadecimais com um prefixo "0x".

A seguinte tabela mostra o mapeamento de tipos de dados em parâmetros e conjuntos de resultados:

Tipo de dados do SQL ServerTipo de dados SQLValue
CLR UDTSQL_SS_UDT-151 (sqlncli.h)

A seguinte tabela discute a estrutura correspondente e o tipo do C do ODBC. Essencialmente, UDT do CLR é um varbinary tipo com metadados adicionais.

Tipo de dados SQLLayout de memóriaTipos de dados do CValor (sqlext.h)
SQL_SS_UDTSQLCHAR * (unsigned char *)SQL_C_BINARYSQL_BINARY (-2)

As informações são retornadas nos campos IPD são as seguintes:

Campo do descritorSQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_DESC_CASE_SENSITIVESQL_FALSESQL_FALSE
SQL_DESC_CONCISE_TYPESQL_SS_UDTSQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE00
SQL_DESC_DATETIME_INTERVAL_PRECISIONnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALESQL_FALSESQL_FALSE
SQL_DESC_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LOCAL_TYPE_NAME"udt""udt"
SQL_DESC_OCTET_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISIONnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE00
SQL_DESC_TYPESQL_SS_UDTSQL_SS_UDT
SQL_DESC_TYPE_NAME"udt""udt"
SQL_DESC_UNSIGNEDSQL_TRUESQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAMEO nome do catálogo que contém o UDT.O nome do catálogo que contém o UDT.
SQL_CA_SS_UDT_SCHEMA_NAMEO nome do esquema que contém o UDT.O nome do esquema a contém o UDT.
SQL_CA_SS_UDT_TYPE_NAMEO nome do UDT.O nome do UDT.
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAMEO nome totalmente qualificado do assembly do UDT.O nome totalmente qualificado do assembly do UDT.

Parâmetros de UDT, SQL_CA_SS_UDT_TYPE_NAME deve sempre ser definido por meio de SQLSetDescField. SQL_CA_SS_UDT_CATALOG_NAME e SQL_CA_SS_UDT_SCHEMA_NAME são opcionais.

Se o UDT for definido no mesmo banco de dados com um esquema diferente que a tabela, SQL_CA_SS_UDT_SCHEMA_NAME deve ser definido.

Se o UDT for definido em um banco de dados diferente da tabela, SQL_CA_SS_UDT_CATALOG_NAME e SQL_CA_SS_UDT_SCHEMA_NAME devem ser definidos.

Se houver quaisquer erros ou omissões nas definições de SQL_CA_SS_UDT_TYPE_NAME, SQL_CA_SS_UDT_CATALOG_NAME ou SQL_CA_SS_UDT_SCHEMA_NAME, é gerado um registro de diagnóstico com SQLSTATE HY000 e texto de mensagem específico do servidor.

As informações retornadas nos campos IRD são as seguintes:

Campo do descritorSQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_DESC_AUTO_UNIQUE_VALUESQL_FALSESQL_FALSE
SQL_DESC_CASE_SENSITIVESQL_FALSESQL_FALSE
SQL_DESC_CONCISE_TYPESQL_SS_UDTSQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE00
SQL_DESC_DATETIME_INTERVAL_PRECISIONnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_DISPLAY_SIZE2nSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALESQL_FALSESQL_FALSE
SQL_DESC_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LITERAL_PREFIX"0x""0x"
SQL_DESC_LITERAL_SUFFIX""""
SQL_DESC_LOCAL_TYPE_NAME"udt""udt"
SQL_DESC_OCTET_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISIONnSQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE00
SQL_DESC_SEARCHABLESQL_PRED_NONESQL_PRED_NONE
SQL_DESC_TYPESQL_SS_UDTSQL_SS_UDT
SQL_DESC_TYPE_NAME"udt""udt"
SQL_DESC_UNSIGNEDSQL_TRUESQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAMEO nome do catálogo que contém o UDT.O nome do catálogo que contém o UDT.
SQL_CA_SS_UDT_SCHEMA_NAMEO nome do esquema que contém o UDT.O nome do esquema que contém o UDT.
SQL_CA_SS_UDT_TYPE_NAMEO nome do UDT.O nome do UDT.
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAMEO nome totalmente qualificado do assembly do UDT.O nome totalmente qualificado do assembly do UDT.

Os seguintes valores de coluna são retornados para UDTs:

Nome da colunaSQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
DATA_TYPESQL_SS_UDTSQL_SS_UDT
TYPE_NAMEO nome do UDT.O nome do UDT.
COLUMN_SIZEnSQL_SS_LENGTH_UNLIMITED (0)
BUFFER_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
DECIMAL_DIGITSNULLNULL
SQL_DATA_TYPESQL_SS_UDTSQL_SS_UDT
SQL_DATETIME_SUBNULLNULL
CHAR_OCTET_LENGTHnSQL_SS_LENGTH_UNLIMITED (0)
SS_UDT_CATALOG_NAMEO nome do catálogo que contém o UDT.O nome do catálogo que contém o UDT.
SS_UDT_SCHEMA_NAMEO nome do esquema que contém o UDT.O nome do esquema que contém o UDT.
SS_UDT_ASSEMBLY_TYPE_NAMEO nome totalmente qualificado do assembly do UDT.O nome totalmente qualificado do assembly do UDT.

As últimas três colunas são específicas do driver. Eles são adicionados depois de quaisquer colunas definidas pelo ODBC, mas antes de quaisquer colunas específicas do driver existentes do conjunto de resultados SQLColumns ou SQLProcedureColumns.

Nenhuma linha é retornada por SQLGetTypeInfo, UDTs individuais ou para o tipo genérico "udt".

As conversões de tipos de dados de C para SQL com suporte são as seguintes:

Conversão para e de:SQL_SS_UDT
SQL_C_WCHARSuporte *
SQL_C_BINARYSupported
SQL_C_CHARSuporte *

*Dados binários são convertidos em uma cadeia de caracteres hexadecimal.

As conversões com suporte dos tipos de dados do C para SQL são as seguintes:

Conversão para e de:SQL_SS_UDT
SQL_C_WCHARSuporte *
SQL_C_BINARYSupported
SQL_C_CHARSuporte *

*Ocorre uma cadeia de caracteres hexadecimal para a conversão de dados binários.

Não há suporte para UDTs em colunas de SQL_VARIANT.

Valores de UDTs podem ser importados e exportados somente como valores de caracteres ou binários.

Os UDTs estão sujeitos ao mapeamento de tipo com clientes de baixo nível, conforme indicado a seguir:

Versão do servidor __SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL Server 2005UDTvarbinary(max)
SQL Server 2008 e posteriorUDTUDT

Esta seção discute as alterações feitas nas funções ODBC do SQL Server Native Client para dar suporte a UDTs de CLR grande.

SQLBindCol

Valores de colunas de resultado UDT são convertidos de tipos de dados SQL para C, conforme descrito na seção "Associações e conversões", anteriormente neste tópico.

SQLBindParameter

Os valores necessários para UDTs são os seguintes:

Tipo de dados SQLParameterTypeColumnSizePtrDecimalDigitsPtr
SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDTn0
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_SS_UDTSQL_SS_LENGTH_UNLIMITED (0)0

SQLColAttribute

Os valores retornados para UDTs são os descritos na seção "Campos do descritor dos resultados", anteriormente neste tópico.

SQLColumns

Os valores retornados para UDTs são conforme descrito na seção "Metadados de coluna retornados por SQLColumns e SQLProcedureColumns (metadados de catálogo)", neste tópico.

SQLDescribeCol

Os valores retornados para UDTs são os seguintes:

Tipo de dados SQLDataTypePtrColumnSizePtrDecimalDigitsPtr
SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDTn0
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_SS_UDTSQL_SS_LENGTH_UNLIMITED (0)0

SQLDescribeParam

Os valores retornados para UDTs são os seguintes:

Tipo de dados SQLDataTypePtrColumnSizePtrDecimalDigitsPtr
SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDTn0
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_SS_UDTSQL_SS_LENGTH_UNLIMITED (0)0

SQLFetch

Valores de colunas de resultado UDT são convertidos de tipos de dados SQL para C, conforme descrito na seção "Associações e conversões", anteriormente neste tópico.

SQLFetchScroll

Valores de colunas de resultado UDT são convertidos de tipos de dados SQL para C, conforme descrito na seção "Associações e conversões", anteriormente neste tópico.

SQLGetData

Valores de colunas de resultado UDT são convertidos de tipos de dados SQL para C, conforme descrito na seção "Associações e conversões", anteriormente neste tópico.

SQLGetDescField

Os campos de descritor disponíveis como os novos tipos são descritos nas seções "Campos do descritor dos parâmetros" e "Campos do descritor dos resultados", anteriormente neste tópico.

SQLGetDescRec

Os valores retornados para UDTs são os seguintes:

Tipo de dados SQLTipoSubtipoComprimentoPrecisãoEscala
SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT0nn0
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_SS_UDT0SQL_SS_LENGTH_UNLIMITED (0)SQL_SS_LENGTH_UNLIMITED (0)0

SQLGetTypeInfo

Os valores retornados para UDTs são os descritos na seção "Metadados de coluna retornados por SQLColumns e SQLProcedureColumns (metadados de catálogo)", anteriormente neste tópico.

SQLProcedureColumns

Os valores retornados para UDTs são os descritos na seção "Metadados de coluna retornados por SQLColumns e SQLProcedureColumns (metadados de catálogo)", anteriormente neste tópico.

SQLPutData

Valores de parâmetros UDT são convertidos de tipos de dados de C para SQL, conforme descrito na seção "Associações e conversões", anteriormente neste tópico.

SQLSetDescField

Campos de descritor disponíveis com os novos tipos são descritos nas seções "Campos do descritor dos resultados", neste tópico e "Campos do descritor para parâmetros".

SQLSetDescRec

Os valores permitidos para UDTs são os seguintes:

Tipo de dados SQLTipoSubtipoComprimentoPrecisãoEscala
SQL_SS_UDT

(comprimento inferior ou igual a 8.000 bytes)
SQL_SS_UDT0nn0
SQL_SS_UDT

(comprimento maior que 8.000 bytes)
SQL_SS_UDT0SQL_SS_LENGTH_UNLIMITED (0)SQL_SS_LENGTH_UNLIMITED (0)0

SQLSpecialColumns

Os valores retornados para os UDTs das colunas DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH e DECIMAL_DIGITS são os descritos na seção "Metadados de coluna retornados por SQLColumns e SQLProcedureColumns (metadados de catálogo)", anteriormente neste tópico.

Tipos definidos pelo usuário CLR grandes

Contribuições da comunidade

Mostrar: