2017-08-03 362 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年,這種行爲仍然存在)。