2015-06-25 33 views
1

這項工作我們正在SQL Server 2008和2012編寫基於SQL Server版本

我想寫的是將要使用Format功能的功能上運行的客戶端SQL函數。我有一個與SQL Server 2008中的Format幾乎完全相同的自定義函數,但其​​性能比Format差。

我想使它成爲有條件的,如果它在SQL Server 2012上運行,那麼它會使用內置的T-SQL Format,如果它在SQL Server 2008上,那麼它使用我自己的自定義函數。在SQL Server 2008

CREATE FUNCTION [system].[FunctionName1] 
(
    @param1 VARCHAR(MAX), 
    @param2 VARCHAR(MAX) 
) 
RETURNS nvarchar(Max) 
AS 
BEGIN 

    DECLARE @SQLVersion VARCHAR(16) = CONVERT(VARCHAR(16), SERVERPROPERTY('ProductVersion')) 

    SET @SQLVersion = LEFT(@SQLVersion, ISNULL(NULLIF(CHARINDEX('.', @SQLVersion, 1 + CHARINDEX('.', @SQLVersion)) - 1, - 1), 0)) 

    DECLARE @Return DECIMAL(4, 2) = CASE 
      WHEN ISNUMERIC(@SQLVersion) = 1 
       THEN CONVERT(DECIMAL(4, 2), @SQLVersion) 
      ELSE 0 
      END 
    IF @Return > 11.0 
    BEGIN 
     RETURN Format(@param1, @param2) 
    END 
    ELSE 
    BEGIN 
     RETURN Format_Custom(@parm1, @param2) 
    END 

    RETURN NULL 
END 

的問題是:

所以我寫了這樣的功能的format功能是未知的。所以當我想部署它時會引發語法錯誤。我已經爲它配置了部署腳本。但我想知道我可以以某種方式與SQL內置函數通過Format行或忽略它?

回答

2

不,它不能在一個函數中完成。

它必須能夠編譯之前任何你的邏輯可以執行的代碼,並且它在這一點上失敗,因爲有它不知道的功能。

而且您無法應用通常的解決方法來避開編譯錯誤 - 將不確定編譯的代碼作爲字符串並使用調用EXEC調用單獨編譯/執行 - 因爲您'不允許在UDF中使用動態SQL。

+0

他可以不執行依賴於版本的動態SQL嗎?那麼它不會被編譯 –

+0

@Alec - 正如我所說的,你不能在一個函數中做動態SQL。 –

+0

對不起,我誤讀了那部分。 –