SQL2005关于quotename的用法(转)[通俗易懂]

SQL2005关于quotename的用法(转)[通俗易懂]首先,sqlserver里的标识符有一定的规则,比如 你createtableabc123(…)那么中间含有空格,它不是符合规则的。你会写做createtable[abc123](….)即以[]来定界标识符。quotename将字串成为有效的标识符。它有什么用呢?我举个例子:你有个表名字叫做aa[]bb当

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

首先,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(abcdef,””) –分隔符是两个单引号
‘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 

SQL2005关于quotename的用法(转)[通俗易懂]

 

–结论

/*

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

*/

http://www.cnblogs.com/Fskjb/archive/2010/04/19/1715105.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164266.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UART与USART区别

    UART与USART区别USART:通用同步和异步收发器UART:通用异步收发器当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能。这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下

    2022年5月20日
    49
  • Pytest和Allure测试框架-超详细版+实战

    Pytest和Allure测试框架-超详细版+实战文章目录一:pytest的介绍,安装,框架结构,执行方式1,特点2,安装3,pytest的框架结构4,执行方式二:Pytest-断言、跳过及运行1,Pytest-断言、跳过及运行2,mark中的skip(跳过)3,mark中的xfail(失败)4,使用自定义标记mark只执行部分用例5,文件名类名方法执行部分用例6,-k组合调用执行部分用例三,Pytest-fixture1. 如下:…

    2022年7月26日
    5
  • pytest的使用_java中方法的调用

    pytest的使用_java中方法的调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月29日
    5
  • JSBridge 原理

    JSBridge 原理JSBridge的起源近些年,移动端普及化越来越高,开发过程中选用Native还是H5一直是热门话题。Native和H5都有着各自的优缺点,为了满足业务的需要,公司实际项目的开发过程中往往会融合两者进行Hybrid开发。Native和H5分处两地,看起来无法联系,那么如何才能让双方协同实现功能呢?这时我们想到了Cordova,Cordova提供了一组与设备相关的…

    2025年6月5日
    0
  • typora导出pdf文件缺失

    typora导出pdf文件缺失typora导出pdf文件缺失,原因很可能是在正文中存在<script>标签,比如:当做了脚本执行了,所以很可能在此之后的内容都会确实,调整方案为,用“包裹起来script标签:

    2022年5月20日
    34
  • 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD「建议收藏」

    一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD「建议收藏」一文读懂目标检测:R-CNN、FastR-CNN、FasterR-CNN、YOLO、SSD前言之前我所在的公司七月在线开设的深度学习等一系列课程经常会讲目标检测,包括R-CNN、FastR-CNN、FasterR-CNN,但一直没有比较好的机会深入(但当你对目标检测有个基本的了解之后,再看这些课程你会收益很大)。但目标检测这个领域实在是太火了,经常会看到一些写的不…

    2022年6月11日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号