2010-04-23 42 views
15

是否有以編程方式(在T-SQL中)檢索數據類型的最大值(和最小值)的方法?它會像C#中的float.MaxValue一樣。以編程方式獲取SQL中float的最大值

我想當參數不等於數據庫中的任何實際值使用它在一些選擇,所以我會使用類似

declare @min float 
declare @max float 
--fill @min and @max, can be null if undefined 
select * from foo 
    where bar between isnull(@min,0) and isnull(@max,max(float)/*magic*/) 

回答

21

雖然有不出現任何內聯的方式獲得最小或最大值,there's a solution somebody put together

CREATE TABLE datatype_extrema 
    (min_bit bit NOT NULL DEFAULT (0) CHECK (min_Bit=0) 
    ,max_bit   AS CAST(0x1 AS bit) 
    ,min_tinyint  AS CAST(0x00 AS tinyint) 
    ,max_tinyint  AS CAST(0xFF AS tinyint) 
    ,min_smallint  AS CAST(0x8000 AS smallint) 
    ,max_smallint  AS CAST(0x7FFF AS smallint) 
    ,min_int   AS CAST(0x80000000 AS int) 
    ,max_int   AS CAST(0x7FFFFFFF AS int) 
    ,min_bigint  AS CAST(0x8000000000000000 AS bigint) 
    ,max_bigint  AS CAST(0x7FFFFFFFFFFFFFFF AS bigint) 
    ,min_smalldatetime AS CAST('19000101 00:00' AS smalldatetime) 
    ,max_smalldatetime AS CAST('20790606 23:59' AS smalldatetime) 
    ,min_datetime  AS CAST('17530101 00:00:00.000' AS datetime) 
    ,max_datetime  AS CAST('99991231 23:59:59.997' AS datetime) 
) 
    INSERT INTO datatype_extrema DEFAULT VALUES 
    GO 
    CREATE TRIGGER nochange_datatype_extrema 
    ON datatype_extrema INSTEAD OF INSERT, UPDATE, DELETE 
    AS BEGIN 
    RAISERROR ('No changes allowed for table datatype_extrema.', 16, 1) 
    ROLLBACK TRANSACTION 
    END 
    GO 

之後,你可以最大值複製到本地變量或 (使用查詢時)交這個表的聯接。

Declare @max_int int 
    Set @max_int=(SELECT max_int FROM datatype_extrema) 
    IF COALESCE(@FirstInt, @max_int) < COALESCE(@SecondInt, 0) 
11

以下是浮動和實際類型的默認值(這是缺少公認的答案):

select 
    CAST('-1.79E+308' AS float) as MinFloat, 
    CAST('1.79E+308' AS float) as MaxFloat, 
    CAST('-3.40E+38' AS real) as MinReal, 
    CAST('3.40E+38' AS real) as MaxReal 

遺憾的是無法將其從一個VARBINARY轉換,但VARCHAR工作沒有任何問題。

1

對於floatreal分鐘最大值可以使用POWER函數來計算:

SELECT 
    max_float = (1 + (POWER(2e0, 52) - 1)/POWER(2e0, 52)) * POWER(2e0, 1023) 
    , min_float = -(1 + (POWER(2e0, 52) - 1)/POWER(2e0, 52)) * POWER(2e0, 1023) 
    , max_real = CAST((1 + (POWER(2e0,23)-1)/POWER(2e0,23)) * POWER(2e0,127) AS real) 
    , min_real = CAST(-(1 + (POWER(2e0,23)-1)/POWER(2e0,23)) * POWER(2e0,127) AS real) 

而這些十進制值:

SELECT 
    max_float = 1.7976931348623158E+308 
    , min_float = -1.7976931348623158E+308 
    , max_real = 3.4028234E+38 
    , min_real = -3.4028234E+38 
1
1.79769313486231580799909999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 

這是最大數量浮動

這裏是你如何能得到它:

DECLARE @decimal_length int = 0 
DECLARE @decimal_value varchar(max) = '1.79' 
DECLARE @decimal_value_buffer varchar(max) = @decimal_value 
DECLARE @new_int varchar(10) = '9' 
DECLARE @dummy float 
WHILE @decimal_length < 308 
BEGIN 

    SET @decimal_value = @decimal_value + @new_int 

    BEGIN TRY 
     SET @dummy = CAST(@decimal_value + 'E+308' AS float) 
     SET @decimal_length = @decimal_length + 1 
     SET @decimal_value_buffer = @decimal_value 
     SET @new_int = '9' 
    END TRY 
    BEGIN CATCH 
     SET @decimal_value = @decimal_value_buffer 
     SET @new_int = @new_int - 1 
    END CATCH 
END 

PRINT @decimal_value 
+0

這是例外! – Tigerjz32 2016-06-24 18:43:59

+0

OP的問題更多的是獲得浮點數據類型最大值的編程方式。 – 2016-06-24 19:05:40

+0

我添加了一個確定float何時拋出錯誤的蠻力方法。 – Kyle 2016-06-24 19:10:35