【问题标题】:Sql Server User Defined Table Type column truncatedSql Server 用户定义表类型列被截断
【发布时间】:2014-10-07 21:21:29
【问题描述】:

很长一段时间以来,我们一直在使用用户定义的表来将不同数量的搜索条件从 .Net MVC 应用程序传输到存储过程。

CREATE TYPE [dbo].[SearchCriteriaParametersTableType] AS TABLE
(
    ...
    [SearchCriteriaSequence]    int,
    [SqlParameterStringValue]   varchar(MAX),
    ...
)

我们最近发现了一个我无法弄清楚的错误 - 当 SqlParameterStringValue 是一个长字符串时,它会在 501 个字符后被截断。在 web 应用端调试时,该属性中填充了完整的字符串,但在 Sql profiler 中查看,截断的值在插入语句中(仅显示了一部分),其长度为 501 个字符:

declare @p1 dbo.SearchCriteriaParametersTableType
insert into @p1 values(...,N'23491,23492,23494,...,26930,26',...)

当我将列宽缩短为 50,并尝试传入更长的值时,我收到截断错误。因此,约束似乎不是列宽,传递的值在某处被截断。

这是在 MVC 4 Web 应用程序中运行的,该 sql 由具有自己连接的新 SqlCommand 访问。数据库是 Sql Server 2012。

下面是sql参数的构建方式:

var searchCriteriaParameter = new SqlParameter
{
    ParameterName = parameterName,
     Direction = ParameterDirection.Input,
     SqlDbType = SqlDbType.Structured,
     TypeName = SearchCriteriaParameterType.SearchCriteriaParameterTypeName,
     Value = CriteriaParametersCollection(populatedCriteriaSummaryItems)
     };
 sqlParameters.Add(searchCriteriaParameter);

  public SearchCriteriaCollection CriteriaParametersCollection(IEnumerable<CriteriaSummaryItem> criteriaValues)
    {
        var list = new SearchCriteriaCollection();
        var i = 0;
        foreach (var criteriaValue in criteriaValues)
        {
            list.Add(criteriaValue.AsSearchCriteriaParameterType(criteriaValue, i));
            i++;
        }
        return list;
    }

 public SearchCriteriaParameterType AsSearchCriteriaParameterType(CriteriaSummaryItem filterItem, int i)
    {
        var mode = filterItem.CriteriaType;
        if (!string.IsNullOrEmpty(mode) && !string.IsNullOrEmpty(TextSearchMode))
        {
            mode += "_" + TextSearchMode;
        }

        var searchCriteriaParameterType = new SearchCriteriaParameterType
        {
            SearchCriterionKey = filterItem.SearchCriterionKey,
            SearchCriteriaSequence = i,
            SqlParameterName = filterItem.SqlParameterName,
            SqlParameterStringValue = filterItem.IDValues,
            CriteriaSearchMode = mode
        };
        return searchCriteriaParameterType;
    }

有什么想法可以去哪里看吗?

【问题讨论】:

  • 您能否运行 SQL 探查器跟踪以查看整个字符串是否正在传递到 SQL Server?
  • 你能展示设置SqlCommand和参数的代码吗?
  • Jane S:上面的 2 行 sn-p 来自 sql profiler。我选择了所有 t-sql 和存储过程事件,除了上面将值传输到该列的语句之外,我没有看到任何其他语句。如果您想展示其他设置,请告诉我
  • Aaron - 我在上面添加了添加代码。在调试断点处,就在执行 sql 命令之前,看起来填充了完整的字符串。

标签: c# .net sql-server tsql table-valued-parameters


【解决方案1】:

这很可能是由于该字段的SqlMetaData 是如何在SqlDataRecord 中定义的。这部分代码(即SearchCriteriaCollection 的定义)未显示,但我可以说您需要为SqlParameterStringValue 设置SqlMetaDataSize 属性它应该是SqlMetaData.Max。例如:

new SqlMetaData("SqlParameterStringValue", SqlDbType.VarChar, SqlMetaData.Max)

【讨论】:

  • 就是这样,我错过了旧定义。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多