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

标签 tsql ado.net varbinary sqlparameter

我有一个带有 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/

相关文章:

sql - 检查varbinary字段上的ISNULL的策略?

mysql - 主键 - UUID 主键的 VARBINARY 或 BLOB 或 VARCHAR

sql-server - 首先按特定 id 排序,然后按其余顺序排序

c# - 执行标量();用 scope_identity() 生成 "System.InvalidCastException: Specified cast is not valid"

.net - 在 SQL 2005+ 中,CLR 存储过程是否优于 TSQL 存储过程?

entity-framework - "Pluralize or singularize generated object names"设置是什么意思?

c# - 将整数作为 varbinary 发送到 SQL 触发器

c# - 更快地从 varbinary 加载图像

.net - 数据库本地化 - 查找列表 - 更智能的方式

sql-server - 在函数中返回存储过程结果