Sql-Server

持久計算列的數據類型?創建它時我應該轉換/投射嗎?

  • September 6, 2020

持久計算列的數據類型是什麼?

(a) SQL Server 會自動推斷嗎?

(b) 也最好將其轉換為數據類型,這樣 SQL 就不會花時間查找它是什麼數據類型?

create table dbo.CustomerTransaction
(
  CustomerTransactionId int primary key identity(1,1),
  CustomerId int,
  Price decimal(10,2),
  Quantity int,
  TotalAmount as CustomerId * Price PERSISTED  -- should I cast as cast(CustomerId* Price as decimal(10,2) ??
)

資訊從 Stack Overflow 上的這個問題變成了社區 Wiki 答案:什麼是計算列的數據類型?

它由具有最高數據類型優先級的值決定。

根據我在此處的回答,您可以使用sql_variant_property來確定文字表達式的數據類型。eg被解釋為而不是.2147483648``numeric(10,0)``bigint

另外,如果你想強制一個特定的數據類型而不是依賴於數據類型的優先級,你可以在計算中使用CONVERTorCAST來強制它(假設所有潛在的結果都與你選擇的類型兼容)。這在預設情況下最終得到比預期更寬的數據類型的情況下非常有用;我見過的最常見的案例是當你最終得到一個 INT 而不是一個 BIT 時:

Active1 AS CASE WHEN something THEN 1 ELSE 0 END,
Active2 AS CONVERT(BIT, CASE WHEN something THEN 1 ELSE 0 END)

在這種情況下Active1是一個INT(4 個字節),Active2而是一個BIT(1 個字節 - 或更少,如果它與其他BIT列相鄰)。

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