您在参数声明中为 varchar(MAX) 使用啥大小?

Posted

技术标签:

【中文标题】您在参数声明中为 varchar(MAX) 使用啥大小?【英文标题】:What size do you use for varchar(MAX) in your parameter declaration?您在参数声明中为 varchar(MAX) 使用什么大小? 【发布时间】:2010-11-01 16:13:54 【问题描述】:

我通常在 ADO.NET 中创建参数时设置列大小。

但是如果列的类型是VARCHAR(MAX),我应该使用什么大小?

cmd.Parameters.Add("@blah", SqlDbType.VarChar, ?????).Value = blah;

【问题讨论】:

【参考方案1】:

在这种情况下,您使用 -1。

【讨论】:

将所有参数长度设置为 -1 是否有任何性能缺陷,因此我不必维护 db 匹配列表? 对于小于 8000 字节的值,Varchar(max) 的处理方式与 varchar(8000) 相同。对于较大的值,该字段被视为“文本”字段(又名“CLOB”)。这可能会影响查询计划优化和检索此列中具有较大值的行的效率,因为数据是“行外”存储的,需要额外的查找。 在sql中使用nvarchar(max),在c#中用SqlDbType.NVarchar定义长度-1 如果不是下面 Sam Meshesha 的回答 - 我会错过你的回答。如果您将示例代码行格式化为代码,您的答案可能会获得更多选票。【参考方案2】:

对于我们这些没有看到 Michal Chaniewski 的 -1 的人来说,完整的代码行:

cmd.Parameters.Add("@blah",SqlDbType.VarChar,-1).Value = "some large text";

【讨论】:

【参考方案3】:

最大 SqlDbType.VarChar 大小为 2147483647。

如果您使用通用 oledb 连接 而不是 sql,我发现 here 还有一个 LongVarChar 数据类型。它的最大尺寸是 2147483647。

cmd.Parameters.Add("@blah", OleDbType.LongVarChar, -1).Value = "very big string";

【讨论】:

【参考方案4】:

如果你这样做:

    cmd.Parameters.Add("@blah",SqlDbType.VarChar).Value = "some large text";

大小将取自“一些大文本”。长度

当它是一个输出参数时,这可能会出现问题,当您输入输入时,您将无法返回更多字符。

【讨论】:

我似乎对我未设置其大小的 SqlParameter 感到异常,即使我确实分配了一个值 - 但是,我没有使用 Add 的重载,而是创建SqlParameter 实例本人。您正在使用的Add 的重载是否已经将Size 初始化为可能的东西?【参考方案5】:

不需要传递size参数,只要声明Varchar已经明白是MAX就好了:

cmd.Parameters.Add("@blah",SqlDbType.VarChar).Value = "some large text";

【讨论】:

由于执行计划的计算方式,这可能会对您的 SQL 服务器产生负面影响。 我发现在使用输出参数时情况并非如此。它会导致以下错误 `Exception:String[2]: the Size property has an invalid size of 0.` 要解决此问题,请使用 Size = -1 请参阅***.com/questions/21087950/… 我今天发现这实际上很糟糕,因为 SQL 服务器每次都必须重新编译计划。在我们的例子中,它为一个简单的 INSERT 缓存了 60,000 个计划,因为我们不知道这一点。

以上是关于您在参数声明中为 varchar(MAX) 使用啥大小?的主要内容,如果未能解决你的问题,请参考以下文章

从文本转移到 varchar(MAX):MS Access 有啥问题吗?

Amazon Redshift - 表列声明为 varchar(max) 但强制为 varchar(255)

Oracle中VARCHAR2的大小声明为1字节是啥意思?

varchar(max) 无处不在?

用大于 8000 的大小替换所有 varchar 列声明

gcc 警告“在 GCC 7.1 中为 X 传递的项目参数已更改”是啥意思?