2

C#のString.Formatと同じことを行うCLR関数を探していました。例として、CLR関数を使用して次のことを実行します。

String.Format("My name is {0}, and I live in {1}",myName, cityName)

最初のパラメーターの後に可変数のパラメーターを渡せるようにしたいと思います。これは、このCLR関数の最初のパラメーターで指定されているプレースホルダーの数と同じです。誰かがそのようなCLR関数のC#コードが何であるかについて何か考えを持っていますか?

4

1 に答える 1

1

私は同じものを探しています。次の 2 つのサイトに出会いました: http://www.fotia.co.uk/fotia/Blog/2009/05/indispensable-sql-clr-functions.html & http://stringformat-in-sql.blogspot.com / .

1 つは CLR 関数を使用し、もう 1 つはストアド プロシージャを使用します。

最初の投稿で、ライターは、UDF パラメーターはオプションではないため、可変数のパラメーターを持つことはできないと述べています (少なくとも彼が行っている方法では)。彼は、必要な数または引数を使用して別の関数を作成するだけです。

[SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlString FormatString1(SqlString 形式、オブジェクト arg0、オブジェクト arg1)
{
   戻り形式.IsNull ? SqlString.Null :
       string.Format(format.Value, SqlTypeToNetType(arg0, arg1));
}



編集: これが私がこの問題を解決した方法です。

2 番目の記事のストアド プロシージャを使用して、この関数を作成し、ピボット テーブルを使用してテキストを書式設定しました。私たちのデータベースは、「NET INCOME MARGINAL (${0} TO BELOW ${1})」のようにフォーマットする必要がある文字列をdbo.[Rules]含む列を持つテーブルでセットアップされています。次に、置換する必要がある各値の行を[Description]含む 1-many テーブルを作成します。dbo.[RuleParameters]この列dbo.[SortOrder]は、引数の順序を指定します。この関数は、最大 4 つの引数に対して機能します。

CREATE FUNCTION [dbo].[GetRuleDescriptionWithParameters]
(
    @Code VARCHAR(3)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(400)

    SELECT 
        @Result =
            dbo.FormatString([Description], 
                ISNULL([1], '') + ',' + 
                ISNULL([2], '') + ',' + 
                ISNULL([3], '') + ',' + 
                ISNULL([4], '')
                )
    FROM
    (
        SELECT 
        r.[Description]
        ,rp.Value
        ,rp.SortOrder

        FROM 
            [Rules] r
        LEFT OUTER JOIN [RuleParameters] rp
            ON r.Id = rp.RuleId

        WHERE r.Code = @Code

    ) AS SourceTable
    PIVOT
    (
        MAX(Value)
        FOR SortOrder IN ([1], [2], [3], [4])
    ) AS PivotTable;


    RETURN @Result
END

編集 #2 : さらに例を追加する

フォーマット文字列関数:

CREATE FUNCTION [dbo].[FormatString]
(
    @Format NVARCHAR(4000) ,
    @Parameters NVARCHAR(4000)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Message NVARCHAR(400),
@Delimiter CHAR(1)
DECLARE @ParamTable TABLE ( ID INT IDENTITY(0,1), Paramter VARCHAR(1000) )
SELECT @Message = @Format, @Delimiter = ','
;WITH CTE (StartPos, EndPos) AS
(
    SELECT 1, CHARINDEX(@Delimiter, @Parameters)
    UNION ALL
    SELECT EndPos + (LEN(@Delimiter)), CHARINDEX(@Delimiter,@Parameters, EndPos + (LEN(@Delimiter)))
FROM CTE
WHERE EndPos > 0
)
INSERT INTO @ParamTable ( Paramter )
SELECT
[ID] = SUBSTRING ( @Parameters, StartPos, CASE WHENEndPos > 0 THEN EndPos - StartPos ELSE 4000 END )
FROM CTE
UPDATE @ParamTable SET @Message = REPLACE ( @Message, '{'+CONVERT(VARCHAR,ID) + '}',     Paramter )
RETURN @Message
END
GO

ストアドプロシージャを呼び出す方法は次のとおりです。

SELECT r.[Id]
        ,[Code]
        ,[Description]
        ,dbo.GetRuleDescriptionWithParameters([Code])
        ,rp.[Value]
        ,rp.SortOrder
FROM [Rules] r
INNER JOIN [RuleParameters] rp
    ON r.Id = rp.RuleId

これで、このような関数を呼び出すだけで、すべてが適切にフォーマットされます! 使用例と結果を次に示します。

Id  Code    Description                     (No column name)          Value     SortOrder
1   1       NOT THE MINIMUM AGE             NOT THE MINIMUM AGE       18        1
3   8       NET INCOME (BELOW ${0})      NET INCOME (BELOW $400)   400    1
4   9       NET (${0} TO BELOW ${1})          NET ($400 TO BELOW $600)  400         1
4   9       NET (${0} TO BELOW ${1})          NET ($400 TO BELOW $600)  600         2

通常、これを呼び出すときは [RuleParameters] テーブルに結合しませんが、この場合は結合して、前後のデータを 1 つのデータセットで確認できるようにしました。

于 2012-11-06T21:42:22.090 に答える