Подтвердить что ты не робот

Каков тип данных вычисленного столбца?

Когда вы CREATE TABLE используете выражение CASE для создания вычисленного столбца, вы явно не определяете тип данных этого столбца:

CREATE TABLE OrderDetail
( OrderID INT
, ProductID INT
, Qty INT
, OrderDate DATETIME
, ShipDate DATETIME
, STATUS AS CASE
       WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN 3 
       WHEN shipdate is NOT NULL THEN 2 
       ELSE 1
   end
 )
GO

Как SQL Server решает тип данных этого столбца?

4b9b3361

Ответ 1

Для выражения CASE это ветвь с наивысшим приоритетом datatype. В вашем примере все три ветки - это литералы, которые находятся в диапазоне, который будет интерпретироваться как целые числа, поэтому тип столбца будет int

Вы можете использовать sql_variant_property, чтобы определить, какой тип данных является литеральным выражением в соответствии с моим ответом здесь. например 2147483648 интерпретируется как numeric(10,0), а не bigint.

В случае в вопросе SQL Server признает, что результирующий столбец будет NOT NULL, но часто для вычисленных выражений необходимо обернуть выражение в ISNULL, чтобы получить этот эффект.

Ответ 2

Кроме того, если вы хотите принудительно установить определенный тип данных вместо того, чтобы полагаться на приоритет типа данных, вы можете использовать CONVERT или CAST в вычислении, чтобы заставить его (предполагая, что все потенциальные результаты совместимы с типом, который вы выберите). Это может быть очень полезно в тех случаях, когда по умолчанию вы получаете более широкий тип данных, чем вы предполагали; самый распространенный случай использования, который я видел, - это когда вы заканчиваете 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).