SQL函数,COALESCE&排序

时间:2014-01-09 17:58:32

标签: sql sql-server

ALTER FUNCTION [dbo].[fnGetTrustNotesByTrustIDForAdminConsole] 
( @TrustID INT
)
RETURNS varchar(MAX)
AS
BEGIN
    DECLARE @listStr VARCHAR(MAX)

    SELECT @listStr = COALESCE(@listStr + '|' , '') + ltrim(Note.NoteText)
    FROM   TrustNote
    JOIN   Note 
    ON     TrustNote.NoteID = Note.NoteID
    and    Note.Archived = 0
    WHERE  Trustid = @TrustID

    RETURN @listStr

END

这个函数从数据库中返回“Notes”并编译它们,但是Note(List.ListOrderNumber)中还有一个列,除了合并之外我还要排序。

我知道在返回之前添加订单并不起作用,但有没有办法将其添加进来?

示例数据

Note 1, Position 2
Note 2, Position 3
Note 3, Position 1

目前检索完全如此处所述。 在Where子句之后添加ORDER BY Note.ListOrderNumber只会产生一个结果:

Note 2, Position 3

2 个答案:

答案 0 :(得分:0)

您的函数当前正在返回VARCHAR(MAX) - 并且SELECT语句将变量设置为1行字段(可能是第一行)。这将始终返回1 varchar字段。如果你想返回所有行,你必须做两件事之一(取决于你如何适应你的其他代码,因为你可能需要更改调用过程):

选项1: 创建一个游标并循环遍历SELECT语句并继续追加变量@liststr 这将仍然返回一个长字符串

选项2: 更改函数以返回表格 例如:

ALTER FUNCTION [dbo].[fnGetTrustNotesByTrustIDForAdminConsole] 
( @TrustID INT
)
RETURNS @Temp TABLE(
  lstStr varchar(MAX)
)
AS
BEGIN

  INSERT INTO @Temp(lstStr)
  SELECT @listStr = COALESCE(@listStr + '|' , '') + ltrim(Note.NoteText)
  FROM   TrustNote
  JOIN   Note 
  ON     TrustNote.NoteID = Note.NoteID
  AND    Note.Archived = 0
  WHERE  Trustid = @TrustID

  RETURN

END

答案 1 :(得分:0)

连接字符串的方法并不总是按预期工作。

PRB: Execution Plan and Results of Aggregate Concatenation Queries Depend Upon Expression Location

改为使用for xml

CREATE FUNCTION [dbo].[fnGetTrustNotesByTrustIDForAdminConsole] 
( @TrustID INT
)
RETURNS varchar(MAX)
AS
BEGIN
    DECLARE @listStr VARCHAR(MAX)

    SET @listStr = 
      (
      SELECT   '|'+Note.NoteText
      FROM     TrustNote
      JOIN     Note 
      ON       TrustNote.NoteID = Note.NoteID
      and      Note.Archived = 0
      WHERE    Trustid = @TrustID
      ORDER BY Note.ListOrderNumber
      FOR XML PATH(''), TYPE
      ).value('text()[1]', 'varchar(max)')

    RETURN STUFF(@listStr, 1, 1, '')

END