quotename用法

转载 2012年08月07日 22:22:42

首先,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能将结果字符串中的这类字符当成文本字符。

相关文章推荐

SQL2005关于quotename的用法(转)

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

java POI读取Excel文件基本用法Demo

  • 2017年11月12日 17:38
  • 10.95MB
  • 下载

SVN基本用法.doc

  • 2017年06月20日 16:11
  • 283KB
  • 下载

python中plot用法——线条、点、颜色

>>>import matplotlib >>>from pylab import * >>>help(plot) Help on function plot in module matplotlib...
  • ztf312
  • ztf312
  • 2015年11月19日 20:42
  • 20462

WaitForSingleObject的用法-(判断一个程序是否结束)

WaitForSingleObject 的应用   你还再为怎么判断一个程序是否结束而苦恼吗?或许你在想可以用一个循环每隔几秒来判断一次这个进程是否结束,但是这样会有问题,如果间隔时间太短就会很占...

select命令用法详解

  • 2016年03月09日 00:29
  • 12KB
  • 下载

WinDbg用法详解(带书签)

  • 2016年04月13日 22:55
  • 1.43MB
  • 下载

Java List 用法代码分析(非常详细)

Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:quotename用法
举报原因:
原因补充:

(最多只允许输入30个字)