VB 实现 SQL Server 中的 QuoteName 函数

在 SQL Server 中,有这样一个函数 QuoteName,其定义如下:

QUOTENAME('character_string' [, 'quote_character' ])
参数 含义 说明
character_string Unicode 字符串 字符数不能超过 128
quote_character 封闭式分隔符 支持这些字符中的任何一个: '"`()<>[]{}

在 VB 中,可以这样实现:

' #####################################################################
' [功能描述] 在目标字符串的两边添加成对的封闭式分隔符.
' [参数列表] 1. Target          目标字符串;
'            2. QuoteChar       封闭式分隔符 (可选/默认使用一对中括号);
'            3. EnableSQLStyle  是否启用 SQL 风格 (可选/默认不启用).
' [返回类型] String.
' ---------------------------------------------------------------------
' 封闭式分隔符支持这些字符中的任何一个: '"`()<>[]{}
' #####################################################################
Public Function QuoteName(ByVal Target As String, _
                          Optional ByVal QuoteChar As String = "[", _
                          Optional ByVal EnableSQLStyle As Boolean = False) As String
    
    QuoteChar = Trim$(QuoteChar)
    
    If Len(QuoteChar) Then
        Dim intASC As Integer
        
        Dim strQuoteL As String
        Dim strQuoteR As String
        
        intASC = AscW(QuoteChar)
        
        Select Case intASC
            ' '"`
            Case 34, 39, 96
                strQuoteL = ChrW$(intASC)
                strQuoteR = strQuoteL
            ' ()
            Case 40, 41
                strQuoteL = ChrW$(40)
                strQuoteR = ChrW$(41)
            ' <>
            Case 60, 62
                strQuoteL = ChrW$(60)
                strQuoteR = ChrW$(62)
            ' []
            Case 91, 93
                strQuoteL = ChrW$(91)
                strQuoteR = ChrW$(93)
            ' {}
            Case 123, 125
                strQuoteL = ChrW$(123)
                strQuoteR = ChrW$(125)
            Case Else
                Exit Function
        End Select
        
        ' /* 启用 SQL 风格. */
        If EnableSQLStyle Then
            Target = Replace(Target, _
                             strQuoteR, _
                             String$(2, strQuoteR))
        End If
        
        QuoteName = strQuoteL & _
                    Target & _
                    strQuoteR
    End If
End Function

代码测试
无转义字符:

SQL Server VB 返回
SELECT QUOTENAME('user') QuoteName("user") [user]
SELECT QUOTENAME('user', '[') QuoteName("user", "[") [user]
SELECT QUOTENAME('user', ']') QuoteName("user", "]") [user]
SELECT QUOTENAME('user', '`') QuoteName("user", "`") `user`
SELECT QUOTENAME('user', '''') QuoteName("user", "'") 'user'
SELECT QUOTENAME('user', '"') QuoteName("user", """") "user"
SELECT QUOTENAME('user', '<') QuoteName("user", "<")
SELECT QUOTENAME('user', '>') QuoteName("user", ">")
SELECT QUOTENAME('user', '(') QuoteName("user", "(") (user)
SELECT QUOTENAME('user', ')') QuoteName("user", ")") (user)
SELECT QUOTENAME('user', '{') QuoteName("user", "{") {user}
SELECT QUOTENAME('user', '}') QuoteName("user", "}") {user}

有转义字符(这里以大括号为例):

SQL Server VB 返回
SELECT QUOTENAME('user{{', '{') QuoteName("user{{", "{") {user{{}
SELECT QUOTENAME('user{}', '{') QuoteName("user{{", "{", True) {user{}}}

你可能感兴趣的:(VB 实现 SQL Server 中的 QuoteName 函数)