2011-09-01 41 views
0

我正在研究一個函數,這個函數將被不少於10個SProc使用,並且一旦被解決,它可能會增長。SQL 2005 - 變體參數問題

我遇到的問題是我不想爲每個數據類型開發一個函數,這就是爲什麼SQL_VARIANT數據類型看起來非常方便的操作。我知道是可以做ISNULL檢查數據類型,但我也想檢查,看看是否傳遞的值是一個有效的數字,但ISNUMERIC函數不能與SQL_VARIANT一起工作,我不太確定SQL_VARIANT_PROPERTY函數。

到目前爲止的代碼:

CREATE FUNCTION dbo.mpt_Format_Number 
(
    @value SQL_VARIANT 
    , @money BIT 
) 
RETURNS VARCHAR 
AS 
BEGIN 
    --Check for NULL value 
    IF ISNULL(@value) BEGIN 
     -- Value IS NULL, return NULL 
     RETURN NULL 
    END ELSE BEGIN 
     -- Value is NOT NULL 
     DECLARE @TMP VARCHAR 
    END 
END 
+0

爲了便於閱讀,我翻了ISNULL檢查,以便不混淆人;) – GoldBishop

回答

3
CREATE FUNCTION dbo.mpt_Format_Number 
( 
    @value SQL_VARIANT 
    , @money BIT 
) 
RETURNS VARCHAR 
AS 
BEGIN 
--Check for NULL value 
IF @value is null 
      -- Value IS NULL, return NULL 
    RETURN NULL 
ELSE 
BEGIN 
    -- Value is NOT NULL 
    if isnumeric(convert(varchar(max), @value)) = 1 RETURN 'Y' -- is valid number 
    --DECLARE @TMP VARCHAR 

END 
return 'N' --is not valid number 
END 

你隨時可以測試這種語法屬性類型。應該很容易在你的功能中失效。

declare @t SQL_VARIANT 
set @t = '3' 
select SQL_VARIANT_PROPERTY(@t, 'basetype') 

結果:

varchar 
+0

塑像爲我工作得很好,演員和轉換可以正常使用的一樣,唯一的區別就是你可以添加一個格式到轉換 –

+0

@tclausen - SQL「編譯器」不停地嘔吐,並說我需要使用轉換,而不是鑄造 – GoldBishop

+0

@GoldBishop我看到了問題,我使用的是2008年,微軟修復了這個錯誤。對於那個很抱歉。我改變了它。我希望現在一切正常 –

0

這裏作爲最終實現,因爲它使用了全功能。

ALTER FUNCTION [dbo].[_mpt_Format_Number] 
(
    @value SQL_VARIANT 
    , @money BIT = 0 
) 
RETURNS VARCHAR(max) 
AS 
BEGIN 
    DECLARE @ret VARCHAR(MAX) 
    --Check for NULL value 
    IF @value IS NULL BEGIN 
     -- Value IS NULL, return NULL 
     SET @ret = 'NULL' 
    END ELSE BEGIN 
     -- Value is NOT NULL 

     --Check for Numeric Value 
     IF ISNUMERIC(CONVERT(VARCHAR, @value)) = 0 BEGIN 
      --Value is NOT a Number, return NULL 
      SET @ret = 'NULL' 
     END ELSE BEGIN 
      --Value IS a Number 
      declare @isNeg BIT 
      declare @tmp varchar(max) 
      set @tmp = convert(varchar(max), round(cast(@value as money), 0), 1) 

      --Check if value is negative 
      if @value < 0 begin 
       --Value is Negative 
       set @isNeg = 1 
       --Remove the negative sign 
       set @tmp = replace(@tmp, '-', '') 
      end 

      --Remove the decimal plus any digits to the right of the decimal 
      set @tmp = left(@tmp ,len(@tmp) - 3) 

      --Is money set to True 
      if @money = 1 begin 
       --Pre-pend the dollar sign to value 
       set @tmp = '$' + @tmp 
      end 

      --Is isNeg set to True 
      if @isNeg = 1 begin 
       --Encapsulate the value with parenthesis 
       set @tmp = '(' + @tmp + ')' 
      end 

      SET @ret = @tmp 
     END 
    END 

    RETURN @ret 
END