问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql语句什么情况下使用N前缀

发布网友 发布时间:2022-04-24 19:36

我来回答

5个回答

热心网友 时间:2022-04-08 03:01

一开始就提到了与数据源无关的问题。当时只是从泛化的角度出发,利用ADO.net的DbProviderFactory根据不同的数据提供程序的名称来实现一个与数据库无关的数据访问基类。但仅仅做到这一步还不能实现真正意义上的与数据源无关。 在程序的开发过程中,如果不考虑使用DbParameter的情况,绝大部分应用都可以用Transact-SQL来搞定,而不需要用到与具体数据源相关的特性。但是,现实总是比较残酷的。DbParameter的应用也是如此广泛,最容易想到的情况就是利用DbParameter来防止注入和用来处理一些不容易写在SQL语句中的值。SQL语句中的参数名随着数据提供程序的不同,也会不同,MS SQL Server用的是“@”,Oracle用的是“:”,到了OleDb基本清一色地改成了“?”。如果不解决这个问题,就没法做到真正的与数据源无关。 如果用NHibernate,可以考虑HQL来解决此问题。HQL代替SQL再经过NHibernate的词法分析器处理,转换为SQL语句。如此一下,就不必考虑数据提供程序的参数前缀到底是啥了。可是本人始终不太喜欢NHibernate(从看到Hibernate时候开始),觉得配置文件太多了,而且体系又比较庞大,因此总寻思着怎么干些所谓的“重复造轮子”的事情。本人的想法很简单,咱不发明新语言,只是简单地针对那绝大部分的情况,将使用Transact-SQL的开发时,把语句中那些五花八门的参数名统一使用“@”,在执行的时候根据具体的数据提供程序进行替换。如此一来,既可以满足与数据源无关的目标,又不需要费太多的力气。 首先要考虑的问题是,如何获取参数的前缀。可以用这个方式来获取参数的前缀“DbConnection.GetSchema("DataSourceInformation").Rows[0]["ParameterMarkerFormat"]”。摘一段MSDN的说明:ParameterMarkerFormat表示如何格式化参数的格式化字符串。如果数据源不支持命名的参数,此字符串中的第一个占位符应是格式化参数名的位置。例如,如果数据源期望使用‘:’为前缀命名参数,此字符串将为“:{0}”。在使用参数名“p1”格式化此字符串时,生成的字符串为“:p1”。如果数据源期望参数以‘@’为前缀,但是名称中已包含该符号,此字符串将为‘{0}’,格式化名为“@p1”的参数的结果将只是“@p1”。如果数据源不期望使用命名参数,而期望使用‘?’字符,格式字符串可以只指定为‘?’,这样将忽略参数名。对于 OLE DB,将返回‘?’。更详细的信息可以参考MSDN中的“通用架构集合 (ADO.NET)”。按照之前的说法,有了参数前缀后,剩下的问题就是如何将SQL语句和DbParameter.ParameterName中的“@”替换掉。DbParameter.ParameterName比较简单,直接String.Replace就OK,但是SQL语句中的情况比较复杂。“@”可能不仅仅出现在参数名中,也可能出现在字符里。简单的Replace可能无法满足要求。最初觉得比较好的做法有2种:正则表达式和词法分析器。但后来考虑到,字符串中 “@” 出现的情况也相当难以预料且参数名比较特殊,为了支持一些特殊字符(比如:中文<总觉得有些人喜欢用>),再加上之前用Antlr2实现了一个基本的Select词法分析器,所以就不考虑使用正则表达式,而是直接在之前的基础上做了些简化,生成了一个仅针对参数的词法分析器。因为有Select语句词法分析器的基础,所以搞定参数的时候就简单得多了。参数的规则可以定义为“@”+标识符,antlr2所需的主要规则2条:1、标识符:(('_' | 'a'..'z' | 'A'..'Z' | '\u2e81'..'\u2eca' |'\u3447'..'\u4dae' | '\u4e00'..'\u9fa5' | '\uf92c'..'\ufa29')+ ('0'..'9' | 'a'..'z' | 'A'..'Z' | '_' | '\u2e81'..'\u2eca' |'\u3447'..'\u4dae' | '\u4e00'..'\u9fa5' | '\uf92c'..'\ufa29')*) {$setType(Token.SKIP);}2、参数:('@' N_QUOTED_STRING)=>(('@' N_QUOTED_STRING) {_ttype=PARAMETER;}) | (('@' '@' N_QUOTED_STRING)=>('@' '@' N_QUOTED_STRING){_ttype=SYS_VAR;$setType(Token.SKIP);}) | (':' N_QUOTED_STRING)=>((':' N_QUOTED_STRING) {_ttype=PARAMETER;}) | '?'还必须注意的是,要替换的目标只是参数,所以没有必要将其他如:保留字、字符串、数字、符号之类的东西取出来,通通加上“{$setType(Token.SKIP);}”跳过之。 利用词法分析器对SQL语句进行解析,逐个替换掉原来SQL语句中的参数,最后得到的就是可以在目标数据源上执行的SQL语句。虽然有人会提出说,如果执行1000条SQL语句,那不是得执行1000此解析、替换,效率何存?但是,按照经验来说,1次执行1000条SQL语句一般情况下只是参数的值不同,但SQL语句本身并不会有什么差异;如果使用实体进行持久化,碰到这种情况的几率更加减少。所以,本人认为,上述这种替换的做法还是可取的,特别是在某些情况下,一个应用程序运行在两套不同的数据库上时(连线时用服务器数据Oracle,离线时暂时使用本地Access数据库),这个做法就更能显示出它的价值了。

热心网友 时间:2022-04-08 04:19

在服务器上执行的代码中显示的Unicode字符串常量必须以大写字母N为前缀
即使所引用的列已定义为Unicode
类型
如果不使用N
前缀字符串将转换为数据库的默认代码页
这可能导致不识别某些字符```

热心网友 时间:2022-04-08 05:53

N--unicode

当字符类型为nchar/nvarchar/ntext时
有特殊字符存在时,或排序规则不一样:如:简体SQL查繁体字
需要用N'繁体字' 来源引用: http://zhidao.baidu.com/question/96474727.html

热心网友 时间:2022-04-08 07:45

(N'男') 表示 nvarchar或nvhar类型也就是用unicode编码,字符占两个字节

热心网友 时间:2022-04-08 09:53

在使用中文的情况下加上(N'男')
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 眼睛看东西中间有颗黑点。是什么问题啊? sql条件里面带个N是什么意思? 眼睛看东西总感觉有一层黑点点,要透过黑点才可以看清 眼睛看东西感觉有个黑点在动 眼睛看东西出现黑点在漂浮? 眼睛看东西时候有黑点 近期看东西感觉眼睛里有个黑点是怎么回事 DCP7057粉盒寿命跟硒鼓的寿命 兄弟7057mom的硒鼓是哪个型号? 横轴短 纵轴长,如下图,这种图 怎么画出来的?我用origin 画的图都是正方形的,横轴纵轴一样长。谢谢 牛肉与哪些食物相克 在origin 8.0中,如何拉长横坐标例如原来是450-700,单位长度50;变成400-750,单位长度不变 牛肉与什么食物相克 origin 中坐标轴 如何缩短 牛肉和什么食物相克? origin双坐标轴 一长一短 牛肉和什么食物相克相宜 牛肉相克的食物和禁忌 请问牛肉与什么食物相克 origin 作图时间坐标轴跨度问题 Linux系统中DB2备份,报错误SQL2061N:访问介质 介质 的尝试被拒绝。_百... 左眼睛看东西有黑点,怎么回事 linux 怎么在sql语句里加入 \n&#39; 请问看东西时眼睛里有黑点和雾是怎么回事? SQL查询的时候,条件中有一个字段需要前面加N,怎么做可以去掉这个N就能查询出结果? 看东西时总感觉眼前有黑点在漂动是怎么回事 求助,DB2 1069N 错误问题 解释紫薇命盘 sql server中查询的数据比实际的多N倍,请高手修改下语句 心理测试中——“紫薇”是什么意思 为什么看了阳光之后 眼睛看东西就会有很多的小圆黑点 在SQL Server中 输出语句print N&#39;更新成功&#39;中print后面的N是什么意思呢 求解紫薇 sql语句是高手的来赐招啊 加分30 在线等候 帮我看一看紫薇宫!! 查询 连续N条符合条件的数据该怎么写sql 请高人指点我的紫薇盘里各宫的意思,谢谢!! sql server 怎么查询前n条数据 sql语句 decimal(18,0)什么意思 紫薇命盘的看法 详细点能懂的哦