T-SQL(VARCHAR(最大值)VS CLR(字符串的SqlString,SqlChars)?

问题描述:

我有一个问题,我解决不了。我使用的是SQL Server 2005中,C#CLR使用外部DLL。问题我需要使用作为函数参数类型varchar(max)。如果在C#代码我使用stringSqlSring,我不能使用T-SQL类型varchar(max),只需varchar(4000)nvarchar(4000)。我需要说,这可以是当我需要使用超过4000个符号时,所以我需要知道,我需要使用什么C#类型来处理varchar(max)T-SQL(VARCHAR(最大值)VS CLR(字符串的SqlString,SqlChars)?

我已经阅读了很多文章,其中有几篇文章说,为此我可以使用SqlChars。但是!我有操纵字符串。我怎么可以采取行动stringSqlString然后转换为SqlChars? (这可能是SqlChars.ToString()SqlChars.ToSqlString())。

我没有找到任何C#代码。

+0

一个'VARCHAR(最大)目前正使用它的最大容量将不加载到CLR字符串'字符串,因为它会耗尽地址空间。你能更明确地说明你想对这些字符串执行什么操作吗? –

+0

我将任何SQL类型转换为varchar并将此值发送到外部dll。比,对它进行操作并返回到SQL Server。现在我使用SQL/vchar(4000)和C#/字符串。我需要超过4000个符号。 –

+0

@Damien_The_Unbeliever:我的印象是既SQL Server的'VARCHAR(最大值)'还有一个.NET'string'例如可能高达2 GB的大小.... –

尝试使用长度-1。事情是这样的:

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

我不能尝试这个,因为我没有SqlCommand ...只需输入参数 - 操作它 - 输出参数。我需要IN/OUT参数为SqlChars –

+0

虽然'-1'在技术上是正确的,但这个答案仍然与问题无关。这个答案是处理SqlConnection API而不是SQLCLR API。 –

我找到了答案。不只是只有我问了这个问题。我要读的帖子更用心......

能读到这里http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a CLR兼容性的问题解决了并不十分困难。

所有时间我想用varchar(max)并试图使用C#类型string,SqlString,SqlChars。需要使用T-SQL nvarchar(max),你可以使用任何C#类型stringSqlStringSqlChars的!

当然nvarchar在两次占用更多的空间比varchar

+0

SQLCLR不允许使用'VARCHAR',无论是1 - 4000还是'MAX'。 'NVARCHAR'是SQLCLR API通过的唯一字符串类型(好吧,我猜''object' /'SQL_VARIANT'也可以传递一个高达4000的字符串)。如果您传入'VARCHAR'值,它们将被隐式转换为'NVARCHAR'。请不要使用或建议将'string'用作SQLCLR输入或输出参数类型。有关更多信息,请参阅我的系列[[SQLCLR的阶梯]](http://www.sqlservercentral。com/stairway/105855 /),在SQL Server Central上(该站点需要免费注册)。 –

你需要做的就是添加SqlFacet(MAXSIZE = -1)属性参数:

[return: SqlFacet(MaxSize = -1)] 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] 
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS) 
{ return new } 
+0

正确!这将导致VS自动创建正确的脚本! –

+1

这个答案是正确的,应该标记为“接受”。 +1 –