我一直在寻找一个CLR函数,将做同样的事情的String.Format在C#。 举个例子,我想办通过CLR函数如下:
String.Format("My name is {0}, and I live in {1}",myName, cityName)
我想能够在第一个参数,这将尽可能多的占位在第一个参数这个CLR函数指定为后通过可变数量的参数。 任何人有这将是这样一个CLR函数的C#代码的任何想法?
我一直在寻找一个CLR函数,将做同样的事情的String.Format在C#。 举个例子,我想办通过CLR函数如下:
String.Format("My name is {0}, and I live in {1}",myName, cityName)
我想能够在第一个参数,这将尽可能多的占位在第一个参数这个CLR函数指定为后通过可变数量的参数。 任何人有这将是这样一个CLR函数的C#代码的任何想法?
我在寻找同样的事情。 我碰到这两个网站传来: http://www.fotia.co.uk/fotia/Blog/2009/05/indispensable-sql-clr-functions.html & http://stringformat-in-sql.blogspot.com / 。
第一种使用一个CLR功能,另一种使用存储的过程。
在第一篇文章中,笔者指出,UDF参数不可选的,所以你不能有可变数目则params的(至少在路上,他是做什么的)。 他只是创建了他将需要数或ARGS不同的功能。
[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)); }
编辑:这是我如何解决了这个问题对我来说。
使用从第二产品上的存储过程,我创造了这个功能来格式化文本使用数据透视表我要。 我们的数据库是设置与表dbo.[Rules]
具有柱[Description]
具有需要被格式化的字符串,如:“NET收入边际($ {0}至低于$ {1})”。 然后,我们有一个1-许多表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表,但我在这种情况下这样做,你可以看到之前在一个数据集中后的数据。