возврат объединенного значения из скалярной функции TSQL

Я пишу скалярную функцию в T-SQL. Функция должна вставлять начальные нули в поле ввода чисел, длина ввода может варьироваться по длине, т.е. 123, 1234567, 9876543210 и так далее.

Я не уверен, что правильно определил поля, поскольку я пытаюсь включить как входную переменную, так и выходную переменную, которая является новой для меня. Я пытаюсь вставить ведущие нули перед полем ввода и вернуть значение, введенное с ведущими нулями.

ALTER FUNCTION dbo.FN_ZeroPad
(
 @FN_Input_No   varchar(13)
)
RETURNS  varchar(13)
AS
BEGIN

declare @FN_PadZero  varchar (13),
  @Return   varchar (13)
Set  @FN_PadZero = '0000000000000'

select @Return =
      Case
   When @FN_Input_No is null then 'Missing'
    When @FN_Input_No < = 0 then '0000000000000'
   When @FN_Input_No > 0 then  (@FN_PadZero + @FN_Input_No)
  else null End

 RETURN @return
End

person JMS49    schedule 30.06.2010    source источник


Ответы (4)


Попробуйте это, чтобы заполнить ввод нулем для строки, если она меньше 13 символов.

ALTER FUNCTION dbo.FN_ZeroPad
(
 -- the parameters for the function here
 @FN_Input_No   varchar(13)
)
RETURNS  varchar(13)
AS
BEGIN

declare @Return   varchar(13)

  SELECT @return = RIGHT(REPLICATE('0', 13) + @FN_Input_No, 13 ) 

 RETURN @return
End
person p.campbell    schedule 30.06.2010
comment
Это работает! Это намного проще, чем я собирался об этом. Большое спасибо за ваш ответ! - person JMS49; 30.06.2010
comment
Как заявил gbn, нет необходимости использовать функцию REPLICATE(). - person iheartcsharp; 11.02.2013
comment
@ user78739 спасибо за ваш вклад в вопрос, которому 2,5 года. - person p.campbell; 13.02.2013

Нужна всего одна строка: не нужно возиться с LEN, REPLICATE, ISNULL, CONVERT, CAST или локальными переменными...

ALTER FUNCTION dbo.FN_ZeroPad
(
 -- the parameters for the function here
 @FN_Input_No   varchar(13)
)
RETURNS  varchar(13)
AS
BEGIN
    RETURN RIGHT('0000000000000' + @FN_Input_No, 13)
END
person gbn    schedule 30.06.2010

Ваша функция не будет работать так, как написано. Вы строите строку, превышающую размер переменной, и когда вы присваиваете значение переменной @return, она будет занимать самые левые символы, поэтому она всегда будет возвращать 0000000000000.

Лучше всего использовать эту функцию для заполнения, что дает вам гораздо большую гибкость, чем то, что вы пытаетесь использовать, поскольку вы можете указать, сколько символов нужно заполнить (вплоть до длины вашей возвращаемой переменной), а также изменить символ заполнения):

CREATE FUNCTION [dbo].[PadString] 
(    @Seq varchar(16),
    @PadWith char(1),
    @PadLength int
) 
RETURNS varchar(16) AS

BEGIN 
    declare @curSeq varchar(16)
    SELECT @curSeq = ISNULL(REPLICATE(@PadWith, @PadLength - len(ISNULL(@Seq ,0))), '') + @Seq
    RETURN @curSeq
END

Использование этого было бы

SELECT dbo.PadString ('13', '0', 5)

Определяемые пользователем функции можно использовать в операторах выбора в качестве другого столбца, если это необходимо. Они обеспечивают большую гибкость в использовании, чем хранимые процедуры, за счет требования единственного возвращаемого значения, что у вас и есть в данном случае, поэтому UDF идеально подходит.

Эта функция скопирована отсюда:

http://blogs.ugidotnet.org/fgiossi/archive/2007/11/15/how-to-format-a-value-using-t-sql.aspx

person Tim Coker    schedule 30.06.2010
comment
круто, у меня есть ответ, который удовлетворил потребность, но я тоже очень ценю этот вклад. Думаю, это тоже будет очень полезно. - person JMS49; 30.06.2010
comment
Однако проверьте UDF. Если вы новичок в T-SQL, они чрезвычайно полезны, поскольку вы можете использовать их в качестве столбца в операторе select, который открывает множество новых возможностей использования. - person Tim Coker; 30.06.2010

person    schedule
comment
Возможно, вы захотите добавить немного текста к своему ответу, чтобы объяснить, как это решает проблему, а также, возможно, почему вы считаете, что это лучший ответ, чем любые ранее данные ответы, включая тот, который был принят OP. - person Mark; 15.11.2013