2017-08-03 9 views
1

次のコード例を実行すると、次のような結果が表示されます(以下を参照)。 2番目の例で一致する理由を説明してください。私はある程度の理解を失っているに違いない。SQL Server 2008のCHARINDEXが一致しない結果を持つ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年、米国Microsoft CorporationのEnterprise 版のWindows NT 6.1上の(64ビット)(ビルド7601:サービスパック1) (VM)

答えて

3

2番目の例で1が表示される理由は、@strSearchという値を変数定義には長すぎる値に設定しているため、SQL Serverは変数の長さに合わせてトリミングしますバイナリデータは切り捨てられます "エラー)。

まず例:

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年にはこの動作が引き続き発生することがわかります)

関連する問題