2016-11-25 2 views
2

В настоящее время я использую функцию, указанную ниже, чтобы найти текст между двумя строками, моя проблема в том, что ничего не найдено, он просто возвращает ошибку, и я не хочу возвращать ни пространство, ни Null, может ли кто-нибудь предложить какие-либо совет о том, как его изменить.String from 2 Strings

CREATE FUNCTION [dbo].[udf_GetStringBetween2Strings] 
(
    @String varchar(max), 
    @FirstString varchar(256), 
    @SecondString varchar(256) 
) 
RETURNS VARCHAR(max) 
AS 
BEGIN 

    DECLARE @FirstPosition int, @SecondPosition int 
    SET @FirstPosition = CHARINDEX(@FirstString,@String) + LEN(@FirstString) 
    SET @SecondPosition = CHARINDEX(@SecondString,@String) 
    RETURN (SELECT SUBSTRING(@String, @FirstPosition, @SecondPosition - @FirstPosition)) 

END 
+0

Что ваши входные параметры и то, что ваш ожидаемый выход – Mansoor

+0

Привет Мансур, я перепроверил функцию, и я, к сожалению, не спас его правильно, когда я первоначально создан, который был причиной моего оригинального вопроса. Хотя это и зафиксировало вопрос, который я изначально имел, я думал, что буду исследовать его дальше. Например, мой вызов функции читается как select dbo.udf_GetStringBetween2Strings ('', '', '), так как вы можете видеть, что первое, что я ищу, это строка , это возвращает 't_customer_id>, где действительно мне хотелось бы жало «Not Found», поскольку первая строка не существует. – PJD

+0

Вы проверили мой нижний запрос. Он подходит для вашего ожидаемого результата.? – Mansoor

ответ

0

Самый прямой способ это проверить результат CHARINDEX (она возвращает 0, если совпадение не найдено). например

DECLARE @FirstPosition int, @SecondPosition int 
SET @FirstPosition = CHARINDEX(@FirstString,@String) 
if @FirstPosition = 0 return 'Not found' 
set @FirstPosition += LEN(@FirstString) 
SET @SecondPosition = CHARINDEX(@SecondString,@String, @FirstPosition) 
if @SecondPosition = 0 return 'Not found' 
return SUBSTRING(@String, @FirstPosition, @SecondPosition - @FirstPosition) 
+0

Спасибо за ответ, это работает, когда один из параметров отсутствует, но когда они оба там не собирают то, что находится между ними, он просто возвращает Not Found – PJD

+0

Просто протестировал его и, похоже, сработает, но при вставке примера на и от SO, это не так. Это может быть сортировка или какой-то скрытый характер. Не могли бы вы попробовать свежий (не вставленный) пример? –

+0

Спасибо за ответ, я только что попробовал набирать всю функцию с нуля, но все равно получаю те же проблемы, которых я боюсь. – PJD

0

Try This

CREATE FUNCTION [dbo].[udf_GetStringBetween2Strings] 
(
    @String varchar(max), 
    @FirstString varchar(256), 
    @SecondString varchar(256) 
) 
RETURNS VARCHAR(max) 
AS 
BEGIN 

    DECLARE @FirstSplit VARCHAR(100),@SecondSplit VARCHAR(100),@ReturnStr VARCHAR(100) 
    SET @FirstSplit = SUBSTRING(@String,0,CHARINDEX(' ',@String)) 
    SET @String = SUBSTRING(@String,CHARINDEX(' ',@String)+1,LEN(@String)) 
    SET @SecondSplit = @String 

    IF @FirstSplit = @FirstString 
     SET @ReturnStr = @FirstSplit 
    ELSE IF @SecondSplit = REPLACE(@SecondString,'?','') 
     SET @ReturnStr = @SecondSplit 
    ELSE 
     SET @ReturnStr = 'Not Found' RETURN @ReturnStr END 
+0

Привет, Mansoor, Извините за задержку, я попробовал ваш код с моим примером и тот, который я разместил здесь, и я вернулся « ',' ') ", и я вернусь" здесь я должен увидеть 1, я задерживаю это значение с десятичным значением, но из-за текущего результата я получаю сообщение об ошибке с преобразованием типа данных varchar to numeric, который является ошибкой, которую я ожидал бы из-за текущего результата возврата. Спасибо за помощь – PJD

+0

Я отредактировал мой запрос.Зарегистрироваться ?? поле с пустым. Теперь проверьте, что я получил успешный выход для сопоставленного случая и результат «Не найден» для непревзойденных строк – Mansoor

+0

Привет Мансур, я все еще получаю то же возвращаемое значение, что и до того, как я боюсь. – PJD