我可以从存储过程返回varchar(max)吗?

时间:2008-10-21 17:04:00

标签: .net sql-server-2005 stored-procedures

带有SQL Server 2005后端的VB.net Web系统。我有一个返回varchar的存储过程,我们最终得到的值不适合varchar(8000)。

我已将return参数更改为varchar(max),但如何告诉OleDbParameter.Size属性接受任何数量的文本?

作为一个具体的例子,从存储过程中获得返回参数的VB代码看起来像:

objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar)
objOutParam1.Size = 8000
objOutParam1.Direction = ParameterDirection.Output

我可以制作什么。尺寸与(最大)一起使用?

更新

回答一些问题:

出于所有意图和目的,这个文本都需要作为一个块出来。 (改变这将需要比我想做的更多的结构性工作 - 或者我的授权,真的。)

如果我没有设置大小,我会收到错误“String [6]:Size属性的大小无效。”

10 个答案:

答案 0 :(得分:8)

你能使用ADO.NET吗?

编辑:为了澄清,我只是建议你可能要考虑ADO.NET,因为你正在使用VB.NET 2005和SQL Server 2005 - OLEDB是预先的。 NET访问数据库的方式,因此您可以通过使用ADO.NET找到更多的灵活性。

您不应该从存储过程返回VARCHAR。我甚至不确定你能不能。

但是,如果使用OUT参数,则不必按大小指定。例如:

SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar);
p.Direction = ParameterDirection.Output;

不确定这是否符合您的需求,但它应该可以正常工作。

答案 1 :(得分:8)

Upvoted Ed Altofer。 (他首先回答,所以如果你喜欢我的回答,也可以投票)。

OleDb是你的问题。它是一个通用的数据库连接,需要与SQL Server进行通信,因此您具有最低的公分母情况,其中只能完全支持最弱的复合特征集。其中一个丢失的功能是varchar(max)支持。

您正在使用SQL Server 2005和VB.Net。是什么阻止你使用System.Data.SqlClient而不是System.Data.OleDb?

修改
我找到了关于这个问题的文档。见这里:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

相关部分:

  

数据类型 varchar(max),nvarchar(max),varbinary(max),xml,udt 或其他大型对象类型的返回值无法返回到SQL Server之前的客户端版本如果您希望将这些类型用作返回值,则必须使用SQL Server Native Client。

答案 2 :(得分:4)

我认为使用-1作为大小会起作用。至少它应该与ADO.NET。像这样:

objOutParam1 = objCommand.Parameters.Add(“@ RStr”,OleDbType.varchar,-1)

这是一篇很长的文章,但在最后一个例子中显示使用-1:

http://msdn.microsoft.com/en-us/library/bb399384.aspx

答案 3 :(得分:1)

您是否尝试过不指定大小?
是否可以返回TEXT而不是VARCHAR(MAX)?

答案 4 :(得分:0)

这个大字符串是什么样的?它可能是通过附加记录集更好地返回的东西,还是只是注释文本?

答案 5 :(得分:0)

您是否尝试过指定:

objOutParam1.Size = Int32.MaxValue;

答案 6 :(得分:0)

只需使用int.MaxValue作为参数大小。 sproc中的byte []将具有正确的长度。 (我正在使用varbinary但结果将是相同的。)

 param.Size = int.MaxValue;
 param.SqlDbType = SqlDbType.VarBinary;

答案 7 :(得分:0)

您是否尝试使用“OleDbType.LongVarChar”,此类型映射到SQL Server 2K中的Text,并允许您检索超过8K的字符。

答案 8 :(得分:0)

-1选项效果很好。我在几种情况下使用它,我从存储过程中返回varchar(max)。

答案 9 :(得分:-1)

简短的回答是使用TEXT而不是VARCHAR(max)。 8K是数据库页面的最大大小,除了BLOB和TEXT之外,所有数据列都应该适合。这意味着,由于您的其他列,您的可用容量小于8k。

BLOB和TEXT就是Web 1.0。较大的行意味着更大的数据库复制时间和更大的文件I / O.我建议您为此维护一个带有HTTP接口的单独文件服务器。

并且,对于上一栏

DataUrl VARCHAR(255)NOT NULL,

插入新行时,首先计算数据的MD5校验和。其次,将校验和作为文件名上传到文件服务器。三,INSERT INTO ...(...,DataUrl)VALUES(...,“http://fileserver/get?id=”。md5_checksum_data)

使用此设计,即使平均数据大小变为1000倍,您的数据库也会保持冷静。