簡體   English   中英

SQL函數,粗化和排序

[英]SQL Function, COALESCE & Sorting

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(Note.ListOrderNumber)中還有另一列我希望進行排序。

我知道在返回之前僅添加一個訂單是行不通的,但是有添加此訂單的方法嗎?

示例數據

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

當前完全按照那里的說明進行檢索。 在Where子句之后添加ORDER BY Note.ListOrderNumber僅產生一個結果:

Note 2, Position 3

您的函數當前正在返回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

這種連接字符串的方法並不總是能按預期工作。

PRB:執行計划和聚合連接查詢的結果取決於表達式的位置

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM