T-SQL中的varchar(max)与CLR中的string、SqlString和SqlChars有什么区别?

9

我有一个问题,无法解决。我正在使用SQL Server 2005,C# CLR来使用外部dll。问题在于参数的长度。我需要使用函数参数类型varchar(max)。如果在C#代码中我使用stringSqlSring,我无法使用T-SQL类型varchar(max),只能使用varchar(4000)nvarchar(4000)。我需要说明的是,可能会出现需要使用超过4000个符号的情况,因此我需要知道如何使用哪种C#类型来表示varchar(max)

我已经阅读了很多文章,其中几篇文章说,可以使用SqlChars来解决这个问题。但是!我需要对字符串进行操作,我该如何使用stringSqlString并将其转换为SqlChars?(可能需要使用SqlChars.ToString()SqlChars.ToSqlString())。

我没有找到任何关于此的C#代码。


一个使用了最大容量的 varchar(max) 字符串将无法加载到 CLR 字符串中,因为它会耗尽地址空间。您能否更明确地说明您想对这些字符串执行哪些操作? - Damien_The_Unbeliever
我将任何SQL类型转换为varchar并将该值发送到外部dll。然后,对其进行操作并返回给SQL Server。现在我使用SQL / vchar(4000)和C#/字符串。我需要超过4000个符号。 - Chaki_Black
@Damien_The_Unbeliever:我曾经认为SQL Server的varchar(max)和.NET的string实例都可以达到2GB大小... - marc_s
1
@marc_s - 其实,varchar(max) 变量可以容纳超过2GB。但是我主要是从另一个方面考虑的。当然在32位CLR下,您实际上无法分配2GB的对象,即使在64位下也可能会遇到困难。 - Damien_The_Unbeliever
3个回答

13
您需要做的是在参数中添加SqlFacet(MaxSize = -1)属性:
[return: SqlFacet(MaxSize = -1)]
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS)
{ return new }

正确!这将导致VS自动创建正确的脚本! - Mike Keskinov

4
我找到了答案。不仅仅是我问过这个问题。我必须更加仔细地阅读帖子...
可以在此处阅读:http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a CLR兼容性的问题解决起来并不难。
一直以来,我都想使用varchar(max)并尝试使用C#类型stringSqlStringSqlChars。需要使用T-SQL nvarchar(max),然后您可以使用任何C#类型的stringSqlStringSqlChars
当然,nvarchar占用的空间是varchar的两倍。

SQLCLR 不支持 VARCHAR,无论是 1 - 4000 还是 MAXNVARCHAR 是 SQLCLR API 传递的唯一字符串类型(好吧,我猜 object / SQL_VARIANT 也可以传递最多 4000 的字符串)。如果您传递 VARCHAR 值,则会隐式转换为 NVARCHAR。请不要使用或建议将 string 用作 SQLCLR 输入或输出参数类型。有关更多信息,请参见我在 SQL Server Central 上的系列文章 Stairway to SQLCLR(该网站需要免费注册)。 - Solomon Rutzky

0

尝试使用长度-1,像这样:

cmd.Parameters.Add("@param", SqlDbType.VarChar, -1).Value = "hdfiophdopigherog";

我无法尝试这个,因为我没有SqlCommand...只有输入参数 - 对其进行操作 - 输出参数。而且我需要IN/OUT参数将是SqlChars。 - Chaki_Black
虽然“-1”在技术上是正确的,但这个答案仍然与问题无关。这个答案涉及到SqlConnection API而不是SQLCLR API。 - Solomon Rutzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接