【问题标题】:T-SQL (varchar(max) vs CLR (string, SqlString, SqlChars)?T-SQL (varchar(max) vs CLR (string, SqlString, SqlChars)?
【发布时间】:2011-11-26 15:57:15
【问题描述】:

我有一个问题,我无法解决。我正在使用 SQL Server 2005、C# CLR 来使用外部 dll。问题在于参数的长度。我需要使用函数参数类型varchar(max)。如果在 C# 代码中我使用 stringSqlSring,我不能使用 T-SQL 类型 varchar(max),只能使用 varchar(4000)nvarchar(4000)。我需要说,在某些情况下,当我需要使用超过 4000 个符号时,我需要知道 varchar(max) 需要使用什么 C# 类型。

我读过很多文章,其中有几篇说,为此我可以使用SqlChars。但!我对字符串进行了操作。如何使用stringSqlString 进行操作,然后转换为SqlChars? (可能是SqlChars.ToString()SqlChars.ToSqlString())。

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

【问题讨论】:

  • 使用其最大容量的varchar(max) 字符串将无法加载到 CLR 字符串中,因为它会耗尽地址空间。您能否更明确地说明您希望对这些字符串执行哪些操作?
  • 我将任何 SQL 类型转换为 varchar 并将这个值发送到外部 dll。然后,对其进行操作并返回到 SQL Server。现在我使用 SQL/vchar(4000) 和 C#/string。我需要超过 4000 个符号。
  • @Damien_The_Unbeliever:我的印象是 SQL Server 的 varchar(max) 和 .NET string 实例的大小都可以达到 2 GB....
  • @marc_s - 事实证明,varchar(max) 变量可以contain more than 2GB。但我主要是从另一边工作。当然,在 32 位 CLR 下,您实际上无法分配 2GB 的对象,而且我认为即使在 64 位下您也可以挣扎。

标签: c# tsql sql-server-2005 types sqlclr


【解决方案1】:

你需要做的是给参数添加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 自动创建正确的脚本!
【解决方案2】:

我找到了答案。不只是我问了这个问题。我必须更仔细地阅读帖子......

可以看这里http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3aCLR兼容的问题解决起来不是很困难。

我一直想使用 varchar(max) 并尝试使用 C# 类型 stringSqlStringSqlChars。需要使用T-SQLnvarchar(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(该站点需要免费注册)。
【解决方案3】:

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

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

【讨论】:

  • 我不能尝试这个,因为我没有 SqlCommand... 只需输入参数 - 使用它进行操作 - 输出参数。我需要 IN/OUT 参数将是 SqlChars
  • 虽然-1 在技术上是正确的,但这个答案仍然与问题无关。这个答案是处理 SqlConnection API 而不是 SQLCLR API。
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多