Sql-Server

pg_typeof() 的 SQL Server 等效項是什麼,如何獲取結果集中返回的列的類型?

  • May 12, 2021

使用 PostgreSQL,我可以使用pg_typeof(exp)like

SELECT pg_typeof( cast(1 AS int) );
SELECT pg_typeof(x), x FROM foo;

並取回結果(integer在第一個範例的情況下)。是否有等效的 SQL Server?如何在結果集中找到給定欄位的結果?

SELECT x
FROM foo;

我想知道是什麼類型x的?

有各種間接方法,但沒有什麼比pg_typeof.

SQL_VARIANT_PROPERTY通常是為了方便而使用,但由於它不能包含所有其他類型而有局限性。

將查詢主題寫入表然後檢查元數據是一種方法。與針對元數據視圖編寫查詢相比,可以使用便捷系統儲存過程之類sys.sp_help的更方便的方法。

另一個概念上相關的想法是呼叫:

例如:

EXECUTE sys.sp_describe_first_result_set
   @tsql = N'SELECT 1.0;'

SELECT FRS.* 
FROM sys.dm_exec_describe_first_result_set
   (N'SELECT 1.0;', DEFAULT, DEFAULT) AS FRS;

這些返回大量內部資訊,包括類型詳細資訊。上面的範例返回:

別名類型範例:

CREATE TYPE Banana FROM binary(456) NOT NULL;

EXECUTE sys.sp_describe_first_result_set
   @tsql = N'DECLARE @b Banana; SELECT @b;'

SELECT 
   FRS.system_type_id,
   FRS.system_type_name,
   FRS.user_type_id,
   FRS.user_type_schema,
   FRS.user_type_name
FROM sys.dm_exec_describe_first_result_set
   (N'DECLARE @b Banana; SELECT @b;', DEFAULT, DEFAULT) AS FRS;

返回(部分):

一種方法是使用SQL_VARIANT_PROPERTY( expression , property ),where propertyis "BaseType"

-- returns int
SELECT SQL_VARIANT_PROPERTY(cast(42 as int), 'BaseType');

它也完全壞掉了NULL

-- returns null
SELECT SQL_VARIANT_PROPERTY(cast(null AS int), 'BaseType');=

而且它不適用於所有類型,在不受支持的類型上它會恐慌。

Msg 206 Level 16 State 2 Line 1
Operand type clash: timestamp is incompatible with sql_variant

如果類型是使用者定義的類型(與系統基本類型相比),我似乎無法找到任何有用的資訊,它返回基本類型。

引用自:https://dba.stackexchange.com/questions/291395