【问题标题】:SQL Server output param truncated where it is too longSQL Server 输出参数在太长的地方被截断
【发布时间】: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 +'},'

【问题讨论】:

标签: sql sql-server stored-procedures output


【解决方案1】:

当使用字符串连接时,喜欢

SET @ret = N'[' + @mdlGroup + N']'

并参考[n]varchar(max) + [n]varchar(max)

我得到了正确的完整字符串。同时感谢@MartinSmith。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多