Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Use TYPEPROPERTY() para retornar informações sobre um tipo de dados no SQL Server


No SQL Server, você pode usar o TYPEPROPERTY() função para retornar informações sobre um tipo de dados.

Você fornece o nome do tipo de dados, bem como a propriedade que deseja retornar, e ele retorna informações sobre essa propriedade para o tipo de dados fornecido.

Você pode usar TYPEPROPERTY() para tipos de dados do sistema e tipos de dados definidos pelo usuário.


Sintaxe


A sintaxe fica assim:
TYPEPROPERTY (type , property)

Onde tipo é o tipo de dados e propriedade é a propriedade específica sobre a qual você deseja obter informações.

Existem 5 propriedades possíveis:AllowsNull , ID do proprietário , Precisão , Escala e UsaAnsiTrim .

Para obter informações mais detalhadas sobre essas propriedades e como elas funcionam com essa função, consulte a documentação da Microsoft.

Exemplo 1 – Uso básico


Aqui está um exemplo básico para demonstrar como funciona.
SELECT TYPEPROPERTY('int', 'Precision') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| 10       |
+----------+

Esse resultado nos diz que o int tipo de dados tem uma precisão de 10.

Exemplo 2 – Todas as propriedades


Aqui está um exemplo que retorna todas as propriedades para datetime2 tipo de dados.
SELECT 
  TYPEPROPERTY( 'datetime2', 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY( 'datetime2', 'OwnerId') AS [OwnerId],
  TYPEPROPERTY( 'datetime2', 'Precision') AS [Precision],
  TYPEPROPERTY( 'datetime2', 'Scale') AS [Scale],
  TYPEPROPERTY( 'datetime2', 'UsesAnsiTrim') AS [UsesAnsiTrim];

Resultado:
+--------------+-----------+-------------+---------+----------------+
| AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|--------------+-----------+-------------+---------+----------------|
| 1            | 4         | 27          | 7       | NULL           |
+--------------+-----------+-------------+---------+----------------+

O motivo UsesAnsiTrim é NULL porque essa propriedade é aplicável apenas para tipos de dados binários e string.

Para demonstrar, aqui está novamente, exceto usando um tipo de dados string:
SELECT 
  TYPEPROPERTY( 'varchar', 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY( 'varchar', 'OwnerId') AS [OwnerId],
  TYPEPROPERTY( 'varchar', 'Precision') AS [Precision],
  TYPEPROPERTY( 'varchar', 'Scale') AS [Scale],
  TYPEPROPERTY( 'varchar', 'UsesAnsiTrim') AS [UsesAnsiTrim];

Resultado:
+--------------+-----------+-------------+---------+----------------+
| AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|--------------+-----------+-------------+---------+----------------|
| 1            | 4         | 8000        | NULL    | 1              |
+--------------+-----------+-------------+---------+----------------+

Desta vez Scale é nulo. Isso porque essa propriedade só é aplicável para tipos numéricos e de datas específicas.

Exemplo 3 – Especificando escala ou precisão


Alguns tipos de dados permitem que você especifique uma escala ou precisão, mas TYPEPROPERTY() não vai aceitar isso:
SELECT 
  TYPEPROPERTY( 'datetime2(3)', 'Scale') AS [Datetime2 Scale],
  TYPEPROPERTY( 'datetime2(3)', 'Precision') AS [Datetime2 Precision],
  TYPEPROPERTY( 'varchar(255)', 'Precision') AS [Varchar Precision];

Resultado:
+-------------------+-----------------------+---------------------+
| Datetime2 Scale   | Datetime2 Precision   | Varchar Precision   |
|-------------------+-----------------------+---------------------|
| NULL              | NULL                  | NULL                |
+-------------------+-----------------------+---------------------+

Exemplo 4 – Tipos de dados definidos pelo usuário


A TYPEPROPERTY() A função também funciona em tipos de dados definidos pelo usuário.

Aqui está um exemplo.
SELECT 
  TYPEPROPERTY( 'clientcode', 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY( 'clientcode', 'OwnerId') AS [OwnerId],
  TYPEPROPERTY( 'clientcode', 'Precision') AS [Precision],
  TYPEPROPERTY( 'clientcode', 'Scale') AS [Scale],
  TYPEPROPERTY( 'clientcode', 'UsesAnsiTrim') AS [UsesAnsiTrim];

Resultado:
+--------------+-----------+-------------+---------+----------------+
| AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|--------------+-----------+-------------+---------+----------------|
| 0            | 1         | 8           | NULL    | 1              |
+--------------+-----------+-------------+---------+----------------+

Exemplo 5 – Incluindo o prefixo do esquema de tipo de dados


Você também pode prefixar o tipo de dados com o nome do esquema.
SELECT 
  TYPEPROPERTY( 'sys.int', 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY( 'sys.int', 'OwnerId') AS [OwnerId],
  TYPEPROPERTY( 'sys.int', 'Precision') AS [Precision],
  TYPEPROPERTY( 'sys.int', 'Scale') AS [Scale],
  TYPEPROPERTY( 'sys.int', 'UsesAnsiTrim') AS [UsesAnsiTrim];

Resultado:
+--------------+-----------+-------------+---------+----------------+
| AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|--------------+-----------+-------------+---------+----------------|
| 1            | 4         | 10          | 0       | NULL           |
+--------------+-----------+-------------+---------+----------------+

Exemplo 6 – Informações de retorno para todos os tipos de dados no banco de dados


Aqui está um exemplo que retorna informações de propriedade para todos os tipos de dados no banco de dados atual.

Para fazer isso, eu consulto o sys.types visão do sistema. Eu também uso o SCHEMA_NAME() função para obter o nome do esquema com base em seu ID.
SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name AS [Data Type], 
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'OwnerId') AS [OwnerId],
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'Precision') AS [Precision],
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'Scale') AS [Scale],
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'UsesAnsiTrim') AS [UsesAnsiTrim]
FROM sys.types
ORDER BY name;

Resultado:
+----------+------------------+--------------+-----------+-------------+---------+----------------+
| Schema   | Data Type        | AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|----------+------------------+--------------+-----------+-------------+---------+----------------|
| sys      | bigint           | 1            | 4         | 19          | 0       | NULL           |
| sys      | binary           | 1            | 4         | 8000        | NULL    | 1              |
| sys      | bit              | 1            | 4         | 1           | NULL    | NULL           |
| sys      | char             | 1            | 4         | 8000        | NULL    | 1              |
| dbo      | clientcode       | 0            | 1         | 8           | NULL    | 1              |
| sys      | date             | 1            | 4         | 10          | 0       | NULL           |
| sys      | datetime         | 1            | 4         | 23          | 3       | NULL           |
| sys      | datetime2        | 1            | 4         | 27          | 7       | NULL           |
| sys      | datetimeoffset   | 1            | 4         | 34          | 7       | NULL           |
| sys      | decimal          | 1            | 4         | 38          | 38      | NULL           |
| sys      | float            | 1            | 4         | 53          | NULL    | NULL           |
| sys      | geography        | 1            | 4         | -1          | NULL    | NULL           |
| sys      | geometry         | 1            | 4         | -1          | NULL    | NULL           |
| sys      | hierarchyid      | 1            | 4         | 892         | NULL    | NULL           |
| sys      | image            | 1            | 4         | 2147483647  | NULL    | NULL           |
| sys      | int              | 1            | 4         | 10          | 0       | NULL           |
| sys      | money            | 1            | 4         | 19          | 4       | NULL           |
| sys      | nchar            | 1            | 4         | 4000        | NULL    | NULL           |
| sys      | ntext            | 1            | 4         | 1073741823  | NULL    | NULL           |
| sys      | numeric          | 1            | 4         | 38          | 38      | NULL           |
| sys      | nvarchar         | 1            | 4         | 4000        | NULL    | NULL           |
| sys      | real             | 1            | 4         | 24          | NULL    | NULL           |
| sys      | smalldatetime    | 1            | 4         | 16          | 0       | NULL           |
| sys      | smallint         | 1            | 4         | 5           | 0       | NULL           |
| sys      | smallmoney       | 1            | 4         | 10          | 4       | NULL           |
| sys      | sql_variant      | 1            | 4         | 0           | NULL    | 1              |
| sys      | sysname          | 0            | 4         | 128         | NULL    | NULL           |
| sys      | text             | 1            | 4         | 2147483647  | NULL    | NULL           |
| sys      | time             | 1            | 4         | 16          | 7       | NULL           |
| sys      | timestamp        | 0            | 4         | 8           | NULL    | NULL           |
| sys      | tinyint          | 1            | 4         | 3           | 0       | NULL           |
| sys      | uniqueidentifier | 1            | 4         | 16          | NULL    | NULL           |
| sys      | varbinary        | 1            | 4         | 8000        | NULL    | 1              |
| sys      | varchar          | 1            | 4         | 8000        | NULL    | 1              |
| sys      | xml              | 1            | 4         | -1          | NULL    | NULL           |
+----------+------------------+--------------+-----------+-------------+---------+----------------+

Embora tenha em mente que sys.types já contém a precisão e a escala, você também pode fazer isso:
SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name AS [Data Type], 
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'AllowsNull') AS [AllowsNull],
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'OwnerId') AS [OwnerId],
  Precision,
  Scale,
  TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'UsesAnsiTrim') AS [UsesAnsiTrim]
FROM sys.types
ORDER BY name;

Resultado:
+----------+------------------+--------------+-----------+-------------+---------+----------------+
| Schema   | Data Type        | AllowsNull   | OwnerId   | Precision   | Scale   | UsesAnsiTrim   |
|----------+------------------+--------------+-----------+-------------+---------+----------------|
| sys      | bigint           | 1            | 4         | 19          | 0       | NULL           |
| sys      | binary           | 1            | 4         | 0           | 0       | 1              |
| sys      | bit              | 1            | 4         | 1           | 0       | NULL           |
| sys      | char             | 1            | 4         | 0           | 0       | 1              |
| dbo      | clientcode       | 0            | 1         | 0           | 0       | 1              |
| sys      | date             | 1            | 4         | 10          | 0       | NULL           |
| sys      | datetime         | 1            | 4         | 23          | 3       | NULL           |
| sys      | datetime2        | 1            | 4         | 27          | 7       | NULL           |
| sys      | datetimeoffset   | 1            | 4         | 34          | 7       | NULL           |
| sys      | decimal          | 1            | 4         | 38          | 38      | NULL           |
| sys      | float            | 1            | 4         | 53          | 0       | NULL           |
| sys      | geography        | 1            | 4         | 0           | 0       | NULL           |
| sys      | geometry         | 1            | 4         | 0           | 0       | NULL           |
| sys      | hierarchyid      | 1            | 4         | 0           | 0       | NULL           |
| sys      | image            | 1            | 4         | 0           | 0       | NULL           |
| sys      | int              | 1            | 4         | 10          | 0       | NULL           |
| sys      | money            | 1            | 4         | 19          | 4       | NULL           |
| sys      | nchar            | 1            | 4         | 0           | 0       | NULL           |
| sys      | ntext            | 1            | 4         | 0           | 0       | NULL           |
| sys      | numeric          | 1            | 4         | 38          | 38      | NULL           |
| sys      | nvarchar         | 1            | 4         | 0           | 0       | NULL           |
| sys      | real             | 1            | 4         | 24          | 0       | NULL           |
| sys      | smalldatetime    | 1            | 4         | 16          | 0       | NULL           |
| sys      | smallint         | 1            | 4         | 5           | 0       | NULL           |
| sys      | smallmoney       | 1            | 4         | 10          | 4       | NULL           |
| sys      | sql_variant      | 1            | 4         | 0           | 0       | 1              |
| sys      | sysname          | 0            | 4         | 0           | 0       | NULL           |
| sys      | text             | 1            | 4         | 0           | 0       | NULL           |
| sys      | time             | 1            | 4         | 16          | 7       | NULL           |
| sys      | timestamp        | 0            | 4         | 0           | 0       | NULL           |
| sys      | tinyint          | 1            | 4         | 3           | 0       | NULL           |
| sys      | uniqueidentifier | 1            | 4         | 0           | 0       | NULL           |
| sys      | varbinary        | 1            | 4         | 0           | 0       | 1              |
| sys      | varchar          | 1            | 4         | 0           | 0       | 1              |
| sys      | xml              | 1            | 4         | 0           | 0       | NULL           |
+----------+------------------+--------------+-----------+-------------+---------+----------------+