• SQL2005关于quotename的用法(转)


    首先,sqlserver里的标识符有一定的规则,比如  你
    create table abc 123(...)
    那么中间含有空格,它不是符合规则的。

    你会写做 create table [abc 123](....)
    即以[]来定界标识符。

    quotename将 字串成为有效的标识符。

    它有什么用呢? 我举个例子:


    你有个表名字叫做 aa[]bb

    当某些应用动态语句查询时 你如何写呢
    exec('select * from aa[]bb') ?X

    set @sql='select * from ' + quotename('aa[]bb')
    exec(@sql)

    当然你也可以直接写出转义的写法

    select * from [aa[]]bb]

    也就是说,quotename 使函数中的输入成为一个有效的标识符。
    比如上例中 aa[]bb 不是一个有效的标识符。

    还有一点就是quotename函数有几种写法:
      quotename('aa') 生成的有效的标识符为 [aa]
      quotename('aa','') 生成的有效的标识符为 [aa]
      quotename('aa','''') 生成的有效的标识符为 'aa'

    解释2:

    简单来说吧
    比如你有一个表,名字叫 index
    你有一个动态查询,参数是表名
    declare @tbname varchar(256)
    set @tbname='index'
    ---查这个表里的数据:
    print('select * from '+@tbname)
    exec('select * from '+@tbname)

    --这样print出来的数据是
    select * from index

    因为index是字键字,肯定出错,加上括号就可以了:
    select * from [index]

    这便有了QUOTENAME,即:
    print('select * from '+QUOTENAME(@tbname))
    --结果:select * from [index]
    exec('select * from '+QUOTENAME(@tbname))

    返回带有分隔符的 Unicode 字符串,分隔符的加入可使输入的字符串成为有效的 Microsoft SQL Server 2005 分隔标识符。

    Transact-SQL 语法约定

    语法

    QUOTENAME ( 'character_string' [ , 'quote_character' ] ) 

    参数

    'character_string'

    Unicode 字符数据构成的字符串。character_string 是 sysname 值。

    'quote_character'

    用作分隔符的单字符字符串。可以是单引号 (')、左方括号或右方括号 ([ ]) 或者英文双引号 (")。如果未指定 quote_character,则使用方括号。

    返回类型

    nvarchar(258)

    示例

    以下示例接受字符串 abc[]def 并使用 [] 字符来创建有效的 SQL Server 分隔标识符。

    SELECT QUOTENAME('abc[]def')

     

    下面是结果集: 

    [abc[]]def]
    
    (1 row(s) affected)

     

    请注意,字符串 abc[]def 中的右方括号有两个,用于指示转义符。

    为什么输出结果是:[abc[]]def]呢?

    [abc[]]def]
    分解成
    []]中间的]是表示右边的]是原样输出也就是说]]就表示]
    就跟''中的'要用''来表示一样

    就是说和]]转义后得到--> ] 和两个单引号转义成一个单引号是一个道理

     

    quotename函数看分隔符是什么因为默认是[ ] ,如果用的是}作分界符,那么 SELECT QUOTENAME('abc[]def')

    就不会发生转义了.

    select QUOTENAME('abc''def','''') --分隔符是两个单引号
    -- 'abc''def'
    select QUOTENAME('abc]def') --分隔符是]
    -- [abc]]def]
    select QUOTENAME('abc}def','{}') --分隔符是}
    -- {abc}}def}

    示例:

    create table tab([i[]]d] int);
    go
    select name from sys.columns where object_id=object_id('tab');
    /* i[]d */

    也就是说:SELECT QUOTENAME('abc[]def') ,quotename函数默认分隔符是[ ]
    所以在给quotename('abc[]def')需要对abc后的[]进行转义,如果quotename('abc[]def','{')
    也就是设置了分隔符为{就不会发生转义,该转义取决于分隔符.

     

    简单的说假设你要在分隔符在[ ]里面使用[]那么就必须对综括号里面的]进行转义:]]
    所以结果为:[abc[]]def],同理要在{}里面使用{}那么必须对}进行转义:}}
    那么结果为:{abc{}}def}

    示例:

    select quotename('abc[]def') --默认是分隔符:[ ]
    --
    [abc[]]def]
    select quotename('abc{}def','}')
    --{abc{}}def}

     

    QUOTENAME()函数 

       这个函数和SQL Server对象名组合使用,以将结果传递给表达式。它只用于给输入的字符串加一对方括号,并返回新形成的字符串。如果参数包含保留的分隔符或者封装字符(比如引号或括号),这个函数将修改字符串,以便SQL Server能将结果字符串中的这类字符当成文本字符。如下面的例子所示,查询的结果如图

    1. SELECT QUOTENAME(COLUMN_NAME) AS ColumnName  
    2. FROM INFORMATION_SCHEMA. COLUMNS 

    --结论

    /*

    初步理解为解决有些对象是SQLSERVER关键字的情况,即用该函数规范对象名,以便程序顺利运行

    */

  • 相关阅读:
    洛谷 P3613 【深基15.例2】寄包柜
    洛谷 P1478 陶陶摘苹果(升级版)
    P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    c++优先队列(priority_queue)用法详解
    洛谷 P3817 小A的糖果
    洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    洛谷 P1449 后缀表达式
    洛谷 P1106 删数问题
    在Linux中使用tomcat部署项目
    jar在linux上运行脚本 #start #stop #restart
  • 原文地址:https://www.cnblogs.com/Fskjb/p/1715105.html
Copyright © 2020-2023  润新知