2017-02-21 12 views
0

У меня есть очень простой запрос, который смотрит на большую таблицу местоположений и возвращает данные об определенной улице. Я пытаюсь получить высокие - низкие цифры, чтобы заполнить еще одну строку и решил использовать функцию, чтобы сделать этоSQL Server, используя функцию

CREATE FUNCTION [dbo].[GetMaxStrNo] 
    (@StrFullName varchar) 
RETURNS INT 
AS 
BEGIN 
    RETURN 
     (SELECT 
      MAX(CAST(apt_no AS INT)) 
     FROM 
      location 
     WHERE 
      location_name = @StrFullName 
      AND ISNUMERIC(apt_no) = 1) 
END 
GO 

Try, как я мог бы результаты возвращаются в NULL при вызове из моей основной процедуры

SET @MaxStrNo = dbo.GetMaxStrNo (@StrFullName) 

Любая помощь будет с благодарностью оценена.

Большое спасибо

+0

Возможно, вы передаете значение, которое не существует в таблице – Sankar

+0

StrFullName varchar - это StrFullName varchar (1), поэтому, возможно, у вас нет имени location в базе данных, равного первой букве StrFullName –

ответ

1

Первая очевидная проблема заключается в декларации varchar(). В SQL Server это всегда должно иметь длину:

CREATE FUNCTION [dbo].[GetMaxStrNo](
    @StrFullName varchar(max) 
) RETURNS INT 

Остальная часть вашей функции имеет другую проблему. isnumeric() в предложении where не будет препятствовать ошибке. Используйте try_convert(), чтобы предотвратить ошибку:

BEGIN 
    RETURN (SELECT MAX(TRY_CONVERT(int, apt_no)) 
      FROM location 
      WHERE location_name = @StrFullName and ISNUMERIC(apt_no) = 1 
      ); 
END; 

isnumeric() в предложении where строго по желанию в этом случае.

+0

Many Thanks Gordon ... Работал в первый раз ... Все эти часы, нужно получить эксперта или хотя бы переделать книгу :) Cheers – TheBigChap

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