Sql Server用户定义的表类型列被截断

本文关键字:类型 Server 用户 定义 Sql | 更新日期: 2023-09-27 18:25:55

我们使用用户定义的表作为将不同数量的搜索条件从.Net MVC应用程序转移到存储过程的一种方式已经有很长一段时间了。

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

我们最近发现了一个我一直无法解决的错误——当SqlParameterStringValue是一个长字符串时,它会在501个字符后被截断。当在web应用程序端调试时,完整的字符串填充在该属性中,但在Sql探查器中查看,截断的值在insert语句中(只显示了一部分),其长度为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 Server用户定义的表类型列被截断

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

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