【发布时间】:2022-01-01 08:42:40
【问题描述】:
我有 4 个存储过程。
以下是C#调用的:
ALTER PROCEDURE [dbo].[sp_retrieveResourceShell]
AS
BEGIN
SET NOCOUNT ON
DECLARE @result NVARCHAR(MAX)
EXEC [dbo].[sp_retrieveResTree]
@pid = NULL,
@ret = @result OUTPUT
***select*** @result
END
这些是内部存储过程:
ALTER PROCEDURE [dbo].[sp_retrieveResTree]
(@pid UNIQUEIDENTIFIER,
@ret NVARCHAR(MAX) OUTPUT)
AS
BEGIN
DECLARE @mdlId UNIQUEIDENTIFIER,
@mdlGroup NVARCHAR(MAX)
DECLARE mdlCursor CURSOR FOR
......
DECLARE @subRet NVARCHAR(MAX),
@viewRet NVARCHAR(MAX)
EXEC [dbo].[sp_retrieveResTree]
@pid = @mdlId,
@ret = @subRet OUTPUT
EXEC dbo.sp_retrieveResView
@mdlId = @mdlId,
@ret = @viewRet OUTPUT
SET @mdlGroup = @mdlGroup + FORMATMESSAGE('{"Id":"%s","Name":"%s","Subs":%s,"Views":%s},'...)
.......
SET @ret = FORMATMESSAGE('[%s]',@mdlGroup)
END
ALTER PROCEDURE [dbo].[sp_retrieveResView]
(@mdlId UNIQUEIDENTIFIER,
@ret NVARCHAR(MAX) OUTPUT)
AS
BEGIN
SET @ret = FORMATMESSAGE('[%s]',@viewGroup)
END
当我像这样调用sp_retrieveResourceShell 时:
DECLARE @return_value int
EXEC @return_value = [dbo].[sp_retrieveResourceShell]
SELECT 'Return Value' = @return_value
我可以得到一个在字符串尾部带有省略号的截断字符串。 如何获得没有省略号的完整字符串?
更新
将 formatmessage 函数更改为字符串连接喜欢
SET @mdlGroup = @mdlGroup + '{"Id":"' + CAST(@mdlId AS CHAR(36))+ '","Name":"' + @mdlName + '","Subs":' + @subRet + ',"Views":' + @viewRet +'},'
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
我可以得到一个在字符串尾部带有省略号的截断字符串。 你说的是来自
sp_retrieveResourceShell的打印输出吗?由于打印输出不是结果集的一部分,它实际上取决于客户端会发生什么 - 大多数客户端默认情况下甚至根本不显示它。 -
FORMATMESSAGE 被记录为对超过 2048 个字符的字符串执行此操作。 docs.microsoft.com/en-us/sql/t-sql/functions/…
-
@marc_s ,感谢您的建议。
标签: sql sql-server stored-procedures output