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
答案 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