Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将PascalCase字符串转换为";“友好名称”;在TSQL中_Sql Server_Tsql_User Defined Functions - Fatal编程技术网

Sql server 将PascalCase字符串转换为";“友好名称”;在TSQL中

Sql server 将PascalCase字符串转换为";“友好名称”;在TSQL中,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,我有一个表,其中有一列的值来自枚举。我需要创建一个TSQL函数,以便在检索时将这些值转换为“友好名称” 示例: 'DateOfBirth' --> 'Date Of Birth' 'PrincipalStreetAddress' --> 'Principal Street Address' 我需要一个直接的TSQL UDF解决方案。我没有安装扩展存储过程或CLR代码的选项。如果您使用的是SQL Server 2005,则可以编写本机CLR过程: static string To

我有一个表,其中有一列的值来自枚举。我需要创建一个TSQL函数,以便在检索时将这些值转换为“友好名称”

示例:

 'DateOfBirth' --> 'Date Of Birth'
 'PrincipalStreetAddress' --> 'Principal Street Address'

我需要一个直接的TSQL UDF解决方案。我没有安装扩展存储过程或CLR代码的选项。

如果您使用的是SQL Server 2005,则可以编写本机CLR过程:

static string ToFriendlyCase(this string PascalString)
{
    return Regex.Replace(PascalString, "(?!^)([A-Z])", " $1");
}
产出:

将我的疯狂帕斯卡案例句子转换为友好案例

如果您不使用2005,那么您必须手动解析它,或者使用扩展过程引用regex对象。在这里可以找到一篇好文章:

编辑:自定义项不会影响数据库,因此您不能注册regex com对象,这样就排除了这个想法。但是,存储过程可以-因此这可能是一个路由

为了进行区分大小写的比较,必须将查询的排序规则设置为区分大小写,然后使用替换,我认为。。。下面的一篇文章可能有助于为您指明正确的方向:

/*
试试这个。这是第一次破解-仍然存在添加额外空间的问题
如果第一个字符为大写,则在开始时。
*/
创建函数udf_FriendlyName(@PascalName varchar(max))
返回varchar(最大值)
作为
开始
声明@char(1)
set@char='A'
--在字母A-Z之间循环,用空格和字母替换它们
而ascii(@char)

声明@arg varchar(20)
set@arg='DateOfBirthOnMonday'
声明@argLen int
设置@argLen=len(@arg)
声明@output varchar(40)
设置@output=''
声明@i int
设置@i=1
声明@currentChar varchar(1)
声明@currentCharASCII int
而(1=1)
开始
设置@currentChar=substring(@arg,@i,1)
设置@currentCharASCII=ascii(@currentChar)
如果(@currentCharASCII>=65和@currentCharASCII@argLen)中断
结束
设置@output=ltrim(rtrim(@output))
打印@输出
将@arg的值更改为您想要测试的值


此外,您可能需要更改@output声明以适应与@arg+可能需要的空格数长度相同的字符串。在我的示例中,我将其加倍。

不是最优雅的解决方案,但它可以工作:

declare @pascalCasedString nvarchar(max) = 'PascalCasedString'
declare @friendlyName nvarchar(max) = ''
declare @currentCode int;
declare @currentChar nvarchar;

while (LEN(@pascalCasedString) > 0)
    begin
        set @currentCode = UNICODE(@pascalCasedString)
        set @currentChar = NCHAR(@currentCode)

        if ((@currentCode >= 65) AND (@currentCode <= 90))
        begin
            set @friendlyName += SPACE(1)
        end
        set @friendlyName +=  @currentChar
        set @pascalCasedString = RIGHT(@pascalCasedString,LEN(@pascalCasedString) - 1)
    end

select @friendlyName
declare@pascalCasedString nvarchar(max)='pascalCasedString'
声明@friendlyName nvarchar(最大值)=”
声明@currentcodeint;
声明@currentChar nvarchar;
而(LEN(@pascalCasedString)>0)
开始
设置@currentCode=UNICODE(@pascalCasedString)
设置@currentChar=NCHAR(@currentCode)

如果(@currentCode>=65)和(@currentCode我发现这完全符合要求。提供:

输出:

This Function Will Convert This String To Title Case!

+我只是为了解决这个问题!我需要使用一个直接的TSQL UDF。CLR函数对我来说不是一个选项。嗯,讨厌,我不确定是否可以使用UDF来完成…因为UDF不会影响数据库,所以你不能注册regex库。你必须通过一个存储过程来完成。我很确定你必须用manua来解析它lly.这也会在XML中滑动XML.:/我建议:
newregex(@)(?@Shahkalpesh-行中有语法错误:(@currentCharASCII>=65和@currentCharASCII@argLen)我也测试了它。它不编译。-1所以我认为这段代码在SQL Server中不编译。我假设这是PLSQL或MySQL。我认为这段代码应该可以工作。使它符合TSQL,我会给你一个升级投票。进一步检查后,我发现语法在SQL Server 2008下可以工作,但在较旧版本中无法工作。然而,+1在添加子脚本之后字符串来删除多余的空格,它的作用就像一个符咒。谢谢!只是一个小小的建议:不要使用最终的返回子字符串(@PascalName,2,LEN(@PascalName))--在开始时删除空格你可以使用return LTrim(@PascalName),在这种情况下没有太大的区别,但通常它会删除前导空格(不管有多少个字符)但不会删除除空格以外的任何其他最终字符。@Turro-很好的提示。我当时没有想到这一点,但现在更新了。谢谢!
declare @pascalCasedString nvarchar(max) = 'PascalCasedString'
declare @friendlyName nvarchar(max) = ''
declare @currentCode int;
declare @currentChar nvarchar;

while (LEN(@pascalCasedString) > 0)
    begin
        set @currentCode = UNICODE(@pascalCasedString)
        set @currentChar = NCHAR(@currentCode)

        if ((@currentCode >= 65) AND (@currentCode <= 90))
        begin
            set @friendlyName += SPACE(1)
        end
        set @friendlyName +=  @currentChar
        set @pascalCasedString = RIGHT(@pascalCasedString,LEN(@pascalCasedString) - 1)
    end

select @friendlyName
CREATE FUNCTION dbo.udf_TitleCase (@InputString VARCHAR(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @OutputString VARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 2
SET @OutputString =
STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1)))
WHILE @Index <= LEN(@InputString)
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1)
IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(')
IF @Index + 1 <= LEN(@InputString)
BEGIN
IF @Char != ''''
OR
UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S'
SET @OutputString =
STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1)))
END
SET @Index = @Index + 1
END
RETURN ISNULL(@OutputString,'')
END
SELECT dbo.udf_TitleCase('This function will convert this string to title case!')
This Function Will Convert This String To Title Case!