Mad*_*ing 1 sql sql-server-2008
我们有一个奇怪的问题.我们正在升级JDE,数据库模式正在发生变化 - 一些char列正在更改为nchar类型.但是,我们发现某些搜索不再有效,我们发现这在我们的SQL Server 2008数据库中是一致的:
在我测试的数据库中,ItemNumber列是char(25)并且具有不同的长度内容.
SELECT * FROM TableName WHERE ItemNumber LIKE '%S'
Run Code Online (Sandbox Code Playgroud)
返回一堆行.但是,如果我们将列更改为nchar(25),那么查询现在只返回那些具有以"S"结尾且长度为25个字符的ItemNumber值的行,因此似乎现在正在(可能正确地)采用尾随空格考虑到 - 如果将通配符值更改为'%S',则会找到以"S"结尾的24个字符项目编号.
显然,这对我们来说是个问题,因为*S搜索不再适用于JDE,因为底层数据库调用现在需要修剪每个nchar列.这是一个已知问题,还是我们需要改变的地方?
附加信息 我们无法控制所使用的列类型,也无法更改生成的基础SQL,因为这是我们ERP系统及其升级的一部分.我们已经与Oracle记录了一个电话,但据我所知他们没有看到这个,他们也不能复制它(但我们不知道他们在什么情况下试图这样做),以及它的事实发生在我们的其他数据库/服务器上让我想知道它是不是一个模糊的设置,某处.
从LIKE(Transact-SQL)的文档:
在LIKE中使用Unicode数据(nchar或nvarchar数据类型)时,尾随空白很重要; 但是,对于非Unicode数据,尾随空白并不重要.
我用下表重现了你的问题:
DECLARE @t TABLE(x NCHAR(25));
INSERT @t SELECT N'nanaS';
SELECT x FROM @t WHERE x LIKE N'%S';
Run Code Online (Sandbox Code Playgroud)
结果:
(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用NVARCHAR,则不会发生此问题:
DECLARE @t TABLE(x NVARCHAR(25));
INSERT @t SELECT N'nanaS';
SELECT x FROM @t WHERE x LIKE N'%S';
Run Code Online (Sandbox Code Playgroud)
结果:
x
-----
nanaS
Run Code Online (Sandbox Code Playgroud)
但是原来的表没有产生,即使转换成所期望的结果NVARCHAR中WHERE子句:
DECLARE @t TABLE(x NCHAR(25));
INSERT @t SELECT N'nanaS';
SELECT x FROM @t WHERE CONVERT(NVARCHAR(25),x) LIKE N'%S';
Run Code Online (Sandbox Code Playgroud)
结果:
(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
因此,一个可能的解决方法是首先使用正确的数据类型(并且也始终使用Unicode字符串前缀N'properly'.如果您无法使数据类型正确,您可以使用RTRIM()Aushin发布的解决方法,但请记住HLGEM的注释同样.
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |