Sql-Server
持久計算列的數據類型?創建它時我應該轉換/投射嗎?
持久計算列的數據類型是什麼?
(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
另外,如果你想強制一個特定的數據類型而不是依賴於數據類型的優先級,你可以在計算中使用
CONVERT
orCAST
來強制它(假設所有潛在的結果都與你選擇的類型兼容)。這在預設情況下最終得到比預期更寬的數據類型的情況下非常有用;我見過的最常見的案例是當你最終得到一個 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
列相鄰)。