2017-08-03 322 views
1

当我运行下面的代码示例时:我得到了不同的结果(如下所示)。请解释为什么我在第二个例子中得到一个匹配?我一定错过了一些理解。CHARINDEX在SQL Server 2008 TSQL中有不一致的结果

print @@version 
-- First example behaves as expected 
declare @strSearch nvarchar(10) = 'x (20) '; 
declare @definition nvarchar(100) = 'x (200000000) '; 
print charindex(@strSearch, @definition); 
go 
-- Second example does not behave as expected 
declare @strSearch nvarchar(10) = 'xrchar (20) '; 
declare @definition nvarchar(100) = 'xrchar (200000000) '; 
print charindex(@strSearch, @definition); 

结果如下:(0 '找不到' 1 '发现'):

的Microsoft SQL Server 2008(SP3) - 10.0.5538.0(X64)2015年4月3日14:50 :02版权所有(C)1988-2008微软公司企业 版在Windows NT 6.1(64位)(建设7601:Service Pack 1的) (VM)

回答

3

在第二个示例中得到1的原因是您要为@strSearch设置一个值,该值对于变量定义来说太长了,所以sql server会将其修剪为适合变量的长度(而不是将“string”或“二进制数据将被截断“错误)。
你可以看到它,如果你改变剧本一点点:

第一个例子:

declare @strSearch nvarchar(10) = 'x (20) '; 
declare @definition nvarchar(100) = 'x (200000000) '; 
SELECT @strSearch as '@strSearch', 
     @definition as '@definition', 
     charindex(@strSearch, @definition) as 'charindex'; 

结果:

@strSearch @definition  charindex 
x (20)  x (200000000) 0 

第二个例子:

declare @strSearch nvarchar(10) = 'xrchar (20) '; 
declare @definition nvarchar(100) = 'xrchar (200000000) '; 
SELECT @strSearch as '@strSearch', 
     @definition as '@definition', 
     charindex(@strSearch, @definition) as 'charindex'; 

结果:

@strSearch @definition   charindex 
xrchar (20 xrchar (200000000) 1 

You can see a live demo on rextester(原来在2014年,这种行为仍然存在)。