SQL Server 2008 TSQL 中的 CHARINDEX 结果不一致
CHARINDEX in SQL Server 2008 TSQL with inconsistent results
当我 运行 以下代码示例时: 我得到不同的结果(如下所示)。请解释为什么我在第二个例子中得到匹配?我一定是缺少一些理解。
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 'not found' 和 1 'found'):
Microsoft SQL Server 2008 (SP3) - 10.0.5538.0 (X64) Apr 3 2015
14:50:02 Copyright (c) 1988-2008 Microsoft Corporation Enterprise
Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
(VM)
0 1
在第二个示例中得到 1 的原因是您为 @strSearch
设置的值对于变量定义而言太长,因此 sql 服务器将其修剪以适合长度变量的(而不是引发 "string or binary data would be truncated" 错误)。
稍微修改一下脚本就可以看到:
第一个例子:
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 年,这种行为仍在继续)。
当我 运行 以下代码示例时: 我得到不同的结果(如下所示)。请解释为什么我在第二个例子中得到匹配?我一定是缺少一些理解。
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 'not found' 和 1 'found'):
Microsoft SQL Server 2008 (SP3) - 10.0.5538.0 (X64) Apr 3 2015 14:50:02 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (VM)
0 1
在第二个示例中得到 1 的原因是您为 @strSearch
设置的值对于变量定义而言太长,因此 sql 服务器将其修剪以适合长度变量的(而不是引发 "string or binary data would be truncated" 错误)。
稍微修改一下脚本就可以看到:
第一个例子:
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 年,这种行为仍在继续)。