возврат объединенного значения из скалярной функции TSQL - PullRequest
2 голосов
/ 30 июня 2010

Я пишу скалярную функцию в 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

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

Требуется всего одна строка: не нужно беспокоиться о 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
2 голосов
/ 30 июня 2010

Попробуйте добавить в свой ввод ноль для строки, если она меньше 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
1 голос
/ 30 июня 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

0 голосов
/ 15 ноября 2013
RIGHT('0000000000000'+[field], 13) AS aliasName
...