代码之家  ›  专栏  ›  技术社区  ›  Bashar Abu Shamaa

在SQLServer中创建一个函数,返回许多用于排序的值

  •  1
  • Bashar Abu Shamaa  · 技术社区  · 6 年前

    我有一个存储过程,它有一个定制的排序(在 order by 订货人 我对一些字段进行子字符串和长度计算,并根据两个条件进行排序:

        Order By 
     LEFT(InvoiceID, PATINDEX('%[0-9]%', InvoiceID) - 1), --first sort value
     CONVERT(INT, SUBSTRING(InvoiceID, PATINDEX('%[0-9]%', InvoiceID), LEN(InvoiceID))) -- second sort value
    

    问题是我需要在许多其他存储过程上使用相同的排序。所以我想创建一个应用相同排序的函数。虽然我可以创建一个返回一个值的函数,但我需要一个返回两个值的函数,如上所述。

    此sql函数不起作用:

    CREATE FUNCTION [dbo].[fn_AlphaNumreicSort] (@AlphaNumreicValue nvarchar(MAX))
    RETURNS (
    @SortedVar1  nvarchar(MAX)
    ,@SortedVar2  nvarchar(MAX)
    )
    AS
    ....
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bashar Abu Shamaa    6 年前

    要返回多个值,需要声明一个表值函数。
    part of the query .

    create function [dbo].[fn_AlphaNumreicSort] (@AlphaNumreicValue nvarchar(MAX))
    returns table
    as
    return (
      select
        LEFT(@AlphaNumreicValue, PATINDEX('%[0-9]%', @AlphaNumreicValue) - 1) as SortedVar1,
        CONVERT(INT, SUBSTRING(@AlphaNumreicValue, PATINDEX('%[0-9]%', @AlphaNumreicValue), LEN(@AlphaNumreicValue))) as SortedVar2
    );
    

    然后在查询中使用它 outer apply

    select ...
    from
      some_table
      outer apply [dbo].[fn_AlphaNumreicSort](InvoiceID) as sort_values
    ...
    order by
      sort_values.SortVar1,
      sort_values.SortVar2