从SQL标量函数返回连接值

时间:2010-06-30 16:52:57

标签: sql-server tsql user-defined-functions

我在T-SQL中编写标量函数。该函数应将前导零插入到数字的输入字段中,输入的长度可以在长度上变化,即e。 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 个答案:

答案 0 :(得分:2)

当字符串小于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 :(得分:2)

只需要一行:不需要打扰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 :(得分:1)

您的功能无法正常工作。您正在构建一个大于变量大小的字符串,当您分配给@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)

如果需要,可以在select语句中将用户定义函数用作另一列。它们比存储过程提供更大的灵活性,代价是需要一个返回值,这就是你在这种情况下所拥有的,因此UDF非常适合。

此功能从此处复制:

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

答案 3 :(得分:0)

RIGHT('0000000000000'+[field], 13) AS aliasName