[英]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
這種連接字符串的方法並不總是能按預期工作。
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.