从 TSQL 标量函数返回连接值

Posted

技术标签:

【中文标题】从 TSQL 标量函数返回连接值【英文标题】:returning a concatenated value from a TSQL scalar function 【发布时间】:2010-06-30 16:52:57 【问题描述】:

我正在用 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

【问题讨论】:

【参考方案1】:

当字符串少于 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

【讨论】:

有效!这比我做的要容易得多。非常感谢您的回复! 如gbn所说,不需要使用REPLICATE()函数。 @user78739 感谢您对 2.5 年前的问题提出的意见。【参考方案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

【讨论】:

【参考方案3】:

你的函数不会像写的那样工作。您正在构建一个大于变量大小的字符串,并且当您分配给 @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

【讨论】:

酷,我有一个满足需要的答案,但我也非常感谢这个输入。我认为这也将非常有用。 不过,请查看 UDF。如果您是 T-SQL 新手,它们非常有用,因为您可以将它们用作 select 语句中的列,从而开辟了许多新的使用途径。【参考方案4】:
RIGHT('0000000000000'+[field], 13) AS aliasName

【讨论】:

您可能只想在答案中添加一点文字,以解释这如何解决问题,以及为什么您认为这是比以前给出的任何答案(包括已接受的答案)更好的答案由 OP 提供。

以上是关于从 TSQL 标量函数返回连接值的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Tsql 标量函数转换为表函数?

从标量 SQL 函数返回两个值

TSQL 程序中无法识别 SQL 标量函数元素

连接使用表值函数创建的表时优化 TSQL

TSQL UDF 根据第一个函数参数的值返回具有不同列数的表

如何在sql服务中将列名分配给标量函数的返回值