使用 -1 作为输出 SqlParameter 的大小来检索 VARBINARY(max) 值是否正确?

Is it correct to use -1 as a size for an output SqlParameter to retrieve a VARBINARY(max) value?

我有一个带有 varbinary(MAX) 类型的 OUTPUT 参数的存储过程:

ALTER PROCEDURE [dbo].[StoredProcedure1]
  ...
  @FileData varbinary(MAX) OUTPUT
AS
...

我不知道返回数据的实际大小是多少,所以我不能为 SqlParameter 构造函数的 size 参数使用精确值。另一方面,实际大小可能超过 8 Kb(如果重要的话)。

当我创建 SqlParameter 而不声明尺寸时:

        var fileDataParameter = new SqlParameter("@FileData", SqlDbType.VarBinary)
            { Direction = ParameterDirection.Output };

        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(fileDataParameter);

        command.ExecuteNonQuery();

        var fileData = fileDataParameter.Value as byte[];

我在 command.ExecuteNonQuery() 行收到以下异常:

Additional information: Byte[][0]: the Size property has an invalid size of 0.

所以我需要指定size。有人建议将 -1 作为大小的值传递:

            var fileDataParameter = new SqlParameter("@FileData", SqlDbType.VarBinary, -1)
                { Direction = ParameterDirection.Output };

但是我在 MSDN page 和其他任何地方都找不到关于这个东西的可靠描述。

在我的例子中,@FileData 参数中返回的最大数据大小不超过 10 Mb。

所以问题是 如果将 -1 作为大小传递给映射到 varbinary(MAX) OUTPUT 参数的 SqlParameter 是正确的方法,例如,从性能角度?

这是 MSDN 文档。 https://msdn.microsoft.com/en-us/library/bb399384.aspx - 请参阅 "Using Large Value Type Parameters" 部分

传递“-1”是 "MAX" 值大小的正确方法。因为它是一个 VarChar,所以它不会添加 add 或 return 任何额外的字符,只会添加您在该列中设置的字符。所以应该效率很高。