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) 3 апреля 2015 г. 14:50:02 Copyright (c) 1988–2008 Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1) (ВМ)

0 1


person Walter de Jong    schedule 03.08.2017    source источник


Ответы (1)


Причина, по которой вы получаете 1 во втором примере, заключается в том, что вы устанавливаете значение для вашего @strSearch, которое слишком длинно для определения переменной, поэтому сервер sql обрезает его, чтобы оно соответствовало длине переменной (вместо того, чтобы поднимать «строку или двоичные данные). будет усечено".
Вы можете увидеть это, если немного измените скрипт:

Первый пример:

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

Вы можете увидеть живую демонстрацию на rextester (оказалось, что в 2014 году такое поведение сохраняется).

person Zohar Peled    schedule 03.08.2017