2015-01-07 3 views
0

Я пытаюсь преобразовать этот запрос из базы данных доступа для работы в SQL Server 2008 и застрял. Я знаю, что есть различия, но я не уверен, что происходит, и, видимо, я не очень хорош в этом. Любая помощь будет оценена по достоинству.Запрос доступа к запросу SQL Server 2008

Доступ

Mid(Trim([SC01039]), 
InStrRev(Trim([SC01039])," ")+3,4) 
AS ProductType 

SQL Server 2008 (Это то, что я попытался изменить его к)

Substring(RTrim(LTrim([SC01039])), 
Right(RTrim(LTrim([SC01039])), 
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3,4) 
AS ProductType 

Ошибка я получаю является

«Конверсия удалось при преобразовании значения nvarchar 'L318' к данным типа int. "

Почему он пытается преобразовать полученный текст в целое число? Мое предположение заключается в том, что запрос говорит: «Найдите позицию пространства, ближайшего справа от строки, теперь добавьте 3 к этой позиции и дайте мне следующие 4 символа». Кажется, что проблема связана с данными, а не с запросом (что делает, если нет места? Или строка равна нулю?) Я не знаю ...

Я даже близко подошел? : P

Есть смешанные символы в SC01039, но это пример:

SC01039   :  Expected Output 
------------- :  --------------- 
QC 06999911 :  9999 
SW 12FMT116 :  FMT1 
26RMF399  :  RMF3 
08    :  [empty] 
[empty]   :  [empty] 

Видимо это всегда 4-х символов, начиная с 3 справа от первого найденного свободного пространства (поиск пространства справа -налево). Некоторые данные в SC01039 имеют несколько пробелов (то есть: 09 TVR 012 2, в этом случае он ничего не возвращает, и я считаю, что все в порядке).

+0

показывают данные присутствует в столбце 'SC01039'.' Charindex' часть пошла не так. –

+0

Спасибо за помощь.;) –

ответ

0

У вас проблема с Right(RTrim(LTrim([SC01039])), частью вашего кода. Зачем тебе это? Потому что то, что я показал ниже, должно сделать трюк.

Попробуйте это:

Substring(RTrim(LTrim([SC01039])), 
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4) 
AS ProductType 

подстроки ожидающей SUBSTRING(expression, start, length) и вы предоставили второй параметр с NVARCHAR;

Right(RTrim(LTrim([SC01039])), 
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3 

отсюда ваша ошибка.

Создать эту функцию (вы не должны ставить это помогает с читаемостью

CREATE FUNCTION InStrRev(@Val nvarchar(max), @substr nvarchar(max)) 
RETURNS int 
AS 
BEGIN 
RETURN CASE WHEN CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) = 0 THEN 0 ELSE LEN(@Val) - CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) + 1 END -- add one because you want a start position 
END 

и использовать его в коде, как этого

Substring(RTrim(LTrim([SC01039])), dbo.InStrRev([SC01039], ' ') + 3, 4) AS ProductType 

Надеется, что это помогает

+0

Спасибо за помощь. Это заставило меня пройти мимо ошибки, так как я не понимал, что делаю. Тем не менее, функция «ПРАВО» необходима для поиска с правой стороны (конца) строки для позиции первого «» (пробела).Я попытался это сделать и приблизился к тому, что мне нужно: 'Подстрока ( RTrim (LTrim ([SC01039])), CHARINDEX ('', Обратный (RTrim (LTrim ([SC01039])))) - 1, 4) AS ProductType' –

+0

Каков правильный способ поиска символа в строке справа налево? Моя мысль была «Правильно» изначально, но теперь я вижу, что она возвращает строку, поэтому я немного искал и нашел «Реверс» в качестве возможного решения для поиска позиции пространства справа налево. Это приемлемо? Еще раз спасибо. –

+0

Я исправил свой ответ. – Jaques

Смежные вопросы