大小写敏感问题

时间:2021-03-28 00:48:09
我按装了2005,安装的时候选择了排序规则为Chinese_PRC_BIN2,后来安装DNN,发现里面建立存储过程的地方大小写很混乱,就重新建立一个库,设置Chinese_PRC_CI_AS了,但是这样虽然在查询的时候大小写不敏感,但是
ALTER PROCEDURE [dbo].[GetRole]

@RoleID   int,
@PortalId int

AS

SELECT RoleId,
       PortalId,
       RoleGroupId,
       RoleName,
       Description,
       ServiceFee,
       BillingPeriod,
       BillingFrequency,
       TrialFee,
       TrialPeriod,
       TrialFrequency,
       IsPublic,
       AutoAssignment,
       RSVPCode,
       IconFile
FROM   dbo.Roles
WHERE  RoleId = @RoleId
AND    PortalId = @PortalId

如果参数的地方用@RoleID   int,定义,用的地方  @RoleId,这个sql就不能执行了,类似这种情况很多,提示都是
必须声明标量变量 "@RoleId"。
等,这个应该如何修改呢?

24 个解决方案

#1


方法1  查找替换,把出错的字符串替换掉。
方法2  重新安装服务器,改为不敏感。

#2


直接改服务器的规则,改成大小写通用不行吗?

#3


更改服务器排序规则

#4


修改排序规则

#5


引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改

#6


sql-server排序规则浅谈

修改Microsoft SQL Server 排序规则的方法:
注意:任何操作前,请务必备份数据库!此方法不一定适合您的环境,仅供参考。

操作方法:打开SQL 查询分析器
1、如果是数据库:
ALTER DATABASE 数据库名 COLLATE 排列规则
例如:

ALTER DATABASE 9NPC COLLATE Chinese_PRC_CI_AI

2、如果是表中的字段:
ALTER TABLE 表名 ALTER COLUMN 字段名 数据类型(长度) COLLATE 排列规则
例如:

ALTER TABLE Userinfo ALTER COLUMN name varchar(4) COLLATE Chinese_PRC_CI_AI

#7


从新安装SQL还来的快些,一般默认安装不会出现你这种状况的

#8


引用 5 楼 hztltgg 的回复:
引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没有用。

对象名、变量名大小写不一致,这种编码是不合格的。

#9


服务器排序规则已经修改了,如果是查询select等的话,表名大小写这些都是可以的。
现在是存储过程里的调用参数和内部使用的参数@RoleID不一致,大量的ID和Id混用,我不清楚为什么存储过程里的参数大小写怎么会是敏感的,在哪儿设置?还是说执行存储过程的进程和查询select的进程是不一样的?执行存储过程用的是总服务器的设置,而不是该数据库的设置?

#10


--try
ALTER PROCEDURE [dbo].[GetRole]
@RoleID int ,
@PortalId int
AS
SELECT RoleId,
  PortalId,
  RoleGroupId,
  RoleName,
  Description,
  ServiceFee,
  BillingPeriod,
  BillingFrequency,
  TrialFee,
  TrialPeriod,
  TrialFrequency,
  IsPublic,
  AutoAssignment,
  RSVPCode,
  IconFile
FROM dbo.Roles
WHERE RoleId = @RoleId collate Chinese_PRC_CI_AS
AND PortalId = @PortalId collate Chinese_PRC_CI_AS

#11


引用 8 楼 sqlcenter 的回复:
引用 5 楼 hztltgg 的回复:

引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没……

哎上次遇到过折腾了一个下午,最后没办法还是重装了sql

#12


不错的

#13


引用 8 楼 sqlcenter 的回复:
引用 5 楼 hztltgg 的回复:

引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没……


你的意思是服务器的排序规则和数据库的排序规则是两回事?数据库的排序规则不能覆盖服务器的排序规则?

#14


修改排序规则了

#15


引用 13 楼 hztltgg 的回复:
你的意思是服务器的排序规则和数据库的排序规则是两回事?数据库的排序规则不能覆盖服务器的排序规则?


应该是,因为你的系统数据在系统 Resource 数据库。

#16


那看来只能我去手工修改存储过程了

#17


引用 16 楼 hztltgg 的回复:
那看来只能我去手工修改存储过程了


那也不要这么悲观,我只是一家之言,我也吃不准,先不要结吧,看看其它高手的看法。

#18


联机丛书: 标识符排序规则

标识符的排序规则取决于定义标识符的级别。为实例级对象(如登录名和数据库名)的标识符指派的是实例的默认排序规则。为数据库对象(如表、视图和列名)的标识符指派的是数据库的默认排序规则。连接上下文与一个数据库关联后,可以创建变量、GOTO 标签、临时存储过程和临时表;该上下文切换到其他数据库时,可以引用它们。因此,变量、GOTO 标签和临时表的标识符使用实例的默认排序规则。

#19


现有服务器实例最好不要动。

方案一:为DNN新安装一个实例。

方案二:修改存储过程。把存储过程导成sql脚本,用正则表达式替换可以轻松搞定。

其实严格区分大小写是个好习惯。大小写不加区分,会导致同一个标识符以不同形式出现,只会使开发人员更加难以识别。而且SQL不区分大小写,但相关应用程序(如C#、SSIS等)都是区分大小写的。如果没有严格区分大小写的习惯,系统集成时会遇到很多麻烦。

#20


引用 19 楼 feilniu 的回复:
现有服务器实例最好不要动。

方案一:为DNN新安装一个实例。

方案二:修改存储过程。把存储过程导成sql脚本,用正则表达式替换可以轻松搞定。

其实严格区分大小写是个好习惯。大小写不加区分,会导致同一个标识符以不同形式出现,只会使开发人员更加难以识别。而且SQL不区分大小写,但相关应用程序(如C#、SSIS等)都是区分大小写的。如果没有严格区分大小写的习惯,系统集成时会遇到很多麻烦……


正则表达式不熟悉,能具体说说么?因为变量名很多很混乱

#21


引用 20 楼 hztltgg 的回复:
正则表达式不熟悉,能具体说说么?因为变量名很多很混乱


可以看看这篇“ 正则表达式30分钟入门教程”。

不过这个情况用一般文本编辑器忽略大小写替换就可以解决:把@RoleId替换成@RoleID。

更一般的方法是写一个脚本来处理,每次处理一个存储过程文件:
NormalizeIdentifier.py uspname.sql
对于放在一个文件夹下的所有.sql格式的文件,可以批量处理:
for %i in (*.sql) do NormalizeIdentifier.py %i

NormalizeIdentifier.py的思路:
1. 把输入文件切分成标识符;
2. 识别出以不同大小写形式出现的标识符;选择其中出现次数最多的一种为标准形式;
3. 将文件中不同大小写形式出现的标识符替换为标准形式,写入文件。

批量处理之后,可以用WinMerge对比一下新旧两个文件,检查一下替换是否正确。毕竟程序做不到像人一样智能。

#22


还是挺麻烦,有@RoleID变量,还有RoleId字段,而且不是只有这一个变量,还有别的变量,我手工修改了,上百个存储过程和函数,一个个试过去,花了一上午,唉

#23


这段代码保存为NormalizeIdentifier.py。

import sys
import re
if len(sys.argv) != 3:
    sys.stdout.write("Usage: NormalizeIdentifier.py infile outfile\n")
    sys.exit(1)
infile,outfile = sys.argv[1:3]
filestring = open(infile).read()
identifiers = re.split('\W+', filestring)
unique_identifiers = {}
identifier_count = {}
for id in identifiers:
    uqid = id.lower()
    if uqid not in unique_identifiers:
        unique_identifiers[uqid] = set([id])
    else:
        unique_identifiers[uqid].add(id)
    if id not in identifier_count:
        identifier_count[id] = 1
    else:
        identifier_count[id] += 1
for uqid in unique_identifiers.keys():
    if len(unique_identifiers[uqid]) > 1:
        ids_need_normalize = list(unique_identifiers[uqid])
        id_normal = max(ids_need_normalize, key = identifier_count.get)
        for id in ids_need_normalize:
            filestring = filestring.replace(id, id_normal)
open(outfile, 'w').write(filestring)


需要安装Python 3.X。
假设所有需要修改的存储过程放在D:\Test\old文件夹,新建一个空的D:\Test\new文件夹。
把NormalizeIdentifier.py放在D:\Test目录下,在D:\Test目录执行命令:
for %i in (old\*.sql) do NormalizeIdentifier.py %i new\%~nxi
搞定。

#24


学习。。。。

#1


方法1  查找替换,把出错的字符串替换掉。
方法2  重新安装服务器,改为不敏感。

#2


直接改服务器的规则,改成大小写通用不行吗?

#3


更改服务器排序规则

#4


修改排序规则

#5


引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改

#6


sql-server排序规则浅谈

修改Microsoft SQL Server 排序规则的方法:
注意:任何操作前,请务必备份数据库!此方法不一定适合您的环境,仅供参考。

操作方法:打开SQL 查询分析器
1、如果是数据库:
ALTER DATABASE 数据库名 COLLATE 排列规则
例如:

ALTER DATABASE 9NPC COLLATE Chinese_PRC_CI_AI

2、如果是表中的字段:
ALTER TABLE 表名 ALTER COLUMN 字段名 数据类型(长度) COLLATE 排列规则
例如:

ALTER TABLE Userinfo ALTER COLUMN name varchar(4) COLLATE Chinese_PRC_CI_AI

#7


从新安装SQL还来的快些,一般默认安装不会出现你这种状况的

#8


引用 5 楼 hztltgg 的回复:
引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没有用。

对象名、变量名大小写不一致,这种编码是不合格的。

#9


服务器排序规则已经修改了,如果是查询select等的话,表名大小写这些都是可以的。
现在是存储过程里的调用参数和内部使用的参数@RoleID不一致,大量的ID和Id混用,我不清楚为什么存储过程里的参数大小写怎么会是敏感的,在哪儿设置?还是说执行存储过程的进程和查询select的进程是不一样的?执行存储过程用的是总服务器的设置,而不是该数据库的设置?

#10


--try
ALTER PROCEDURE [dbo].[GetRole]
@RoleID int ,
@PortalId int
AS
SELECT RoleId,
  PortalId,
  RoleGroupId,
  RoleName,
  Description,
  ServiceFee,
  BillingPeriod,
  BillingFrequency,
  TrialFee,
  TrialPeriod,
  TrialFrequency,
  IsPublic,
  AutoAssignment,
  RSVPCode,
  IconFile
FROM dbo.Roles
WHERE RoleId = @RoleId collate Chinese_PRC_CI_AS
AND PortalId = @PortalId collate Chinese_PRC_CI_AS

#11


引用 8 楼 sqlcenter 的回复:
引用 5 楼 hztltgg 的回复:

引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没……

哎上次遇到过折腾了一个下午,最后没办法还是重装了sql

#12


不错的

#13


引用 8 楼 sqlcenter 的回复:
引用 5 楼 hztltgg 的回复:

引用 1 楼 wxf163 的回复:
方法1 查找替换,把出错的字符串替换掉。
方法2 重新安装服务器,改为不敏感。


因为我只是提供服务器,我的服务器不是只给它一个人用的,不应该重装,而那个用DNN建站的觉得这个是框架本身的东西,不应该也不会修改


那就无解,服务器的排序规则决定了变量名、字段名等是否区分大小写,改数据库排序规则没……


你的意思是服务器的排序规则和数据库的排序规则是两回事?数据库的排序规则不能覆盖服务器的排序规则?

#14


修改排序规则了

#15


引用 13 楼 hztltgg 的回复:
你的意思是服务器的排序规则和数据库的排序规则是两回事?数据库的排序规则不能覆盖服务器的排序规则?


应该是,因为你的系统数据在系统 Resource 数据库。

#16


那看来只能我去手工修改存储过程了

#17


引用 16 楼 hztltgg 的回复:
那看来只能我去手工修改存储过程了


那也不要这么悲观,我只是一家之言,我也吃不准,先不要结吧,看看其它高手的看法。

#18


联机丛书: 标识符排序规则

标识符的排序规则取决于定义标识符的级别。为实例级对象(如登录名和数据库名)的标识符指派的是实例的默认排序规则。为数据库对象(如表、视图和列名)的标识符指派的是数据库的默认排序规则。连接上下文与一个数据库关联后,可以创建变量、GOTO 标签、临时存储过程和临时表;该上下文切换到其他数据库时,可以引用它们。因此,变量、GOTO 标签和临时表的标识符使用实例的默认排序规则。

#19


现有服务器实例最好不要动。

方案一:为DNN新安装一个实例。

方案二:修改存储过程。把存储过程导成sql脚本,用正则表达式替换可以轻松搞定。

其实严格区分大小写是个好习惯。大小写不加区分,会导致同一个标识符以不同形式出现,只会使开发人员更加难以识别。而且SQL不区分大小写,但相关应用程序(如C#、SSIS等)都是区分大小写的。如果没有严格区分大小写的习惯,系统集成时会遇到很多麻烦。

#20


引用 19 楼 feilniu 的回复:
现有服务器实例最好不要动。

方案一:为DNN新安装一个实例。

方案二:修改存储过程。把存储过程导成sql脚本,用正则表达式替换可以轻松搞定。

其实严格区分大小写是个好习惯。大小写不加区分,会导致同一个标识符以不同形式出现,只会使开发人员更加难以识别。而且SQL不区分大小写,但相关应用程序(如C#、SSIS等)都是区分大小写的。如果没有严格区分大小写的习惯,系统集成时会遇到很多麻烦……


正则表达式不熟悉,能具体说说么?因为变量名很多很混乱

#21


引用 20 楼 hztltgg 的回复:
正则表达式不熟悉,能具体说说么?因为变量名很多很混乱


可以看看这篇“ 正则表达式30分钟入门教程”。

不过这个情况用一般文本编辑器忽略大小写替换就可以解决:把@RoleId替换成@RoleID。

更一般的方法是写一个脚本来处理,每次处理一个存储过程文件:
NormalizeIdentifier.py uspname.sql
对于放在一个文件夹下的所有.sql格式的文件,可以批量处理:
for %i in (*.sql) do NormalizeIdentifier.py %i

NormalizeIdentifier.py的思路:
1. 把输入文件切分成标识符;
2. 识别出以不同大小写形式出现的标识符;选择其中出现次数最多的一种为标准形式;
3. 将文件中不同大小写形式出现的标识符替换为标准形式,写入文件。

批量处理之后,可以用WinMerge对比一下新旧两个文件,检查一下替换是否正确。毕竟程序做不到像人一样智能。

#22


还是挺麻烦,有@RoleID变量,还有RoleId字段,而且不是只有这一个变量,还有别的变量,我手工修改了,上百个存储过程和函数,一个个试过去,花了一上午,唉

#23


这段代码保存为NormalizeIdentifier.py。

import sys
import re
if len(sys.argv) != 3:
    sys.stdout.write("Usage: NormalizeIdentifier.py infile outfile\n")
    sys.exit(1)
infile,outfile = sys.argv[1:3]
filestring = open(infile).read()
identifiers = re.split('\W+', filestring)
unique_identifiers = {}
identifier_count = {}
for id in identifiers:
    uqid = id.lower()
    if uqid not in unique_identifiers:
        unique_identifiers[uqid] = set([id])
    else:
        unique_identifiers[uqid].add(id)
    if id not in identifier_count:
        identifier_count[id] = 1
    else:
        identifier_count[id] += 1
for uqid in unique_identifiers.keys():
    if len(unique_identifiers[uqid]) > 1:
        ids_need_normalize = list(unique_identifiers[uqid])
        id_normal = max(ids_need_normalize, key = identifier_count.get)
        for id in ids_need_normalize:
            filestring = filestring.replace(id, id_normal)
open(outfile, 'w').write(filestring)


需要安装Python 3.X。
假设所有需要修改的存储过程放在D:\Test\old文件夹,新建一个空的D:\Test\new文件夹。
把NormalizeIdentifier.py放在D:\Test目录下,在D:\Test目录执行命令:
for %i in (old\*.sql) do NormalizeIdentifier.py %i new\%~nxi
搞定。

#24


学习。。。。