我正在我的一个应用程序中从数据库列生成用户界面标签。在这样做时,我遇到了一个问题。在我希望更改的UI中显示与我的数据库表中相同的列名 我有这样的样本数据:
ProductionIssueID
MAXSerialNo
ProductID
Item
我希望将它们格式化为:
Production Issue ID
MAX Serial No
Product ID
Item
逻辑是:
1.当大写字母表成功填写小字母表时,必须插入一个空格,如生产问题ID中所示
2.当小字母表成功填写大写字母时,必须插入空格,如MAX序列号和产品编号
所示
3.如果只有一个大写字母,则无需像项目那样进行任何操作
4.类似的一对大写/小字母之间不需要空格。
请帮助我实现这一目标。这些例子更具描述性。
提前感谢您宝贵的时间和精力。
答案 0 :(得分:2)
我同意这应该在表示层上完成。但是,此功能可以满足您的需求。
CREATE FUNCTION [dbo].[fn_InitCapWord] ( @InputString varchar(1000) )
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @Index INT
DECLARE @OutputString VARCHAR(1000)
DECLARE @substr VARCHAR(1000)
SET @OutputString = ''
WHILE (LEN(@InputString) > 0)
BEGIN
IF (SUBSTRING(@InputString ,2,1) COLLATE Latin1_General_BIN LIKE '%[A-Z]%')
SELECT @Index = PATINDEX('%[a-z]%',SUBSTRING(@InputString,2,999) COLLATE Latin1_General_BIN) -1
ELSE
SELECT @Index = PATINDEX('%[A-Z]%',SUBSTRING(@InputString,2,999) COLLATE Latin1_General_BIN)
SELECT @substr =
CASE WHEN @Index >= 1
THEN SUBSTRING(@InputString,1,@Index)
ELSE @InputString
END
SELECT @OutputString = @OutputString + RTRIM(@substr) + ' '
SELECT @InputString = RIGHT(@InputString,CASE WHEN @Index<=0 THEN 0 ELSE LEN(@InputString) - @Index END)
END
RETURN RTRIM(@OutputString)
END
示例:
PRINT dbo.fn_InitCapWord('ProductionIssueID')
PRINT dbo.fn_InitCapWord('MAXSerialNo')
PRINT dbo.fn_InitCapWord('ProductID')
PRINT dbo.fn_InitCapWord('Item')
输出:
Production Issue ID
MAX Serial No
Product ID
Item
<强>更新强> 我改变了功能。它应该能够处理空间。
PRINT dbo.fn_InitCapWord('Production IssueID')
输出:
Production Issue ID
答案 1 :(得分:0)
SQL意味着/善于处理关系数据。在演示方面进行字符串操作总是一个好习惯。 如果你仍然想要你可以创建一个CLR功能并使用它。
答案 2 :(得分:0)
我同意这纯粹是一个演示问题,最好在表示层完成。这里有一个先前的问题,给你一些建议(有和没有正则表达式)