簡體   English   中英

在 SQL 中設置小數精度 C# 中的 CLR function

[英]Set decimal precision in SQL CLR function in C#

我有一個 SQL CLR function 寫在 C# 中,類似於:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString Decimal(decimal sum)
    {
        return sum.ToString();
    }
}

並且 SQL 服務器假定 'sum' 是numeric(18,0)類型。

有沒有辦法改變 C# 中輸入參數的精度和比例?

可以使用SQLFacet屬性指定精度和小數位數。 例如, [Microsoft.SqlServer.Server.SqlFacet(Precision =..., Scale =...)]...

雖然 allmhuran 關於SqlFacet並不正確,但請理解SqlFacet ,至少對於PrecisionScale屬性(以及至少一些,但可能不是全部,其他屬性)被 Visual Studio / SSDT 用於自動生成 DLL 用於發布. 這意味着,如果您編寫自己的CREATE語句,則不需要依賴SqlFacet 使用 SSDT 執行此操作非常適合初始開發/測試,但SqlFacet不支持您可能想要設置的所有選項,例如參數默認值和/或WITH RETURNS NULL ON NULL INPUT (用於標量 UDF)。 例如:

  •  CREATE FUNCTION [schema_name].[function_name] ( @param1 NVARCHAR(MAX), @param2 DECIMAL(17, 9) ) RETURNS NVARCHAR(MAX) WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT AS EXTERNAL NAME [assembly].[class].[method];
  •  CREATE PROCEDURE [schema_name].[proc_name] @param1 NVARCHAR(4000) = N'default value', @param2 DECIMAL(17, 9) = 123.456789 WITH EXECUTE AS CALLER AS EXTERNAL NAME [assembly].[class].[method];

還:

  • 如果您手動創建對象,您仍然需要 DLL 的VARBINARY文字表示來用於CREATE ASSEMBLY語句(假設 Visual Studio 用於編譯程序集但不使用它/SSDT 來生成發布 SQL 腳本) . 為此,您可以使用我寫的一個簡單的開源命令行實用程序: BinaryFormatter

  • 您應該使用SqlDecimal而不是decimal作為輸入類型。 然后,您可以使用Value屬性從參數中獲取實際的decimal值:

     public static SqlString Decimal([SqlFacet(Precision =..., Scale =..)] SqlDecimal sum) { decimal theValue = sum.Value; }

有關一般使用 SQLCLR 的更多信息,請訪問: SQLCLR 信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM