[英]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
,至少對於Precision
和Scale
屬性(以及至少一些,但可能不是全部,其他屬性)被 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.