我有一个带有 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.
所以我需要指定大小
。有些人建议传递 -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 - 请参阅“使用大值类型参数”部分
传递“-1”是“MAX”值大小的正确方法。因为它是一个 VarChar,它不会添加或返回任何额外的字符,只会添加您在该列中设置的字符。所以它应该非常有效。
关于tsql - 使用 -1 作为输出 SqlParameter 的大小来检索 VARBINARY(max) 值是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30030487/