Sql server 2008 r2 一个CLR函数,相当于C中的string.Format#

Sql server 2008 r2 一个CLR函数,相当于C中的string.Format#,sql-server-2008-r2,clr,user-defined-functions,Sql Server 2008 R2,Clr,User Defined Functions,我正在寻找一个CLR函数,该函数将与C#中的String.Format做相同的事情。例如,我想通过CLR函数执行以下操作: String.Format("My name is {0}, and I live in {1}",myName, cityName) CREATE FUNCTION [dbo].[FormatString] ( @Format NVARCHAR(4000) , @Parameters NVARCHAR(4000) ) RETURNS NVARCHAR(M

我正在寻找一个CLR函数,该函数将与C#中的String.Format做相同的事情。例如,我想通过CLR函数执行以下操作:

String.Format("My name is {0}, and I live in {1}",myName, cityName)
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

我希望能够在第一个参数之后传递可变数量的参数,这将是因为在第一个参数中为这个CLR函数指定了许多占位符。有人知道这种CLR函数的C代码是什么吗?

我也在寻找同样的东西。我发现了这两个网站:&

第一个使用CLR函数,另一个使用存储过程

在第一篇文章中,作者说UDF参数不是可选的,所以不能有数量可变的参数(至少他是这样做的)。他只是用需要的数字或参数创建了一个不同的函数

[SqlFunction(DataAccess = DataAccessKind.None)] public static SqlString FormatString1(SqlString format, object arg0, object arg1) { return format.IsNull ? SqlString.Null : string.Format(format.Value, SqlTypeToNetType(arg0, arg1)); } 编辑#2:添加更多示例

格式化字符串函数:

String.Format("My name is {0}, and I live in {1}",myName, cityName)
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]表,但在本例中我加入了,以便您可以在一个数据集中查看前后的数据。

Valdetero-您将如何使用存储过程方法?你能举个例子吗?很难看出如何使用它。谢谢。顺便说一句,这可能会有很多记录性能不好。有时候,当你只需要工作时,你并不在乎成本。这将用于SSRS服务器报告中;否则我就用代码来做。我已经添加了我的示例用法。如果答案对您有帮助,请将其标记为答案。