子字符串自动应用于查询中的文本类型列

本文关键字:文本 类型 查询 字符串 应用于 | 更新日期: 2023-09-27 18:26:37

我有以下查询

select * from table1

如果表1包含文本类型的列,那么我只需要100个字符的

假设最终用户不知道表的模式(列名),只知道表名从作为前端应用程序的查询分析器执行此查询。用户编写器在文本区域查询并执行

*我正在使用SqlServer2005
在从前端开始的查询中不要使用子字符串函数
我可以在C#代码中的文本列上使用子字符串函数,但我希望在数据库端使用此函数。*

子字符串自动应用于查询中的文本类型列

如果我理解正确,你希望用户指定一个表名,并返回SELECT*FROM的结果,所有文本字段都限制在100个字符以内,所有这些都在数据库端?

在我看来,你需要创建一个存储过程才能做到这一点。您的输入参数将是表名,然后继续查询表的结构,并构建一个动态SELECT语句,该语句在大于100个字符的文本字段上使用SQL子字符串。在存储过程中运行动态SQL语句,结果就是这样。

要获得表结构,只需运行以表名为参数的存储过程sp_help。结果将包含列名和类型。循环使用它来构建动态SQL语句。

我建议在应用程序逻辑中而不是在SQL中这样做,尤其是因为您谈论的似乎是多个表。

使用SqlDataReader,循环遍历结果并根据需要剪切字符串:

while(reader.Read())
{
  var rawValues = reader.GetValues();
  var values = new object[rawValues.Length];
  for (i=0; i < rawValues.Length; i++)
  {
    var value = rawValues[i];
    if(value != null && value is string && value.Length > 100]
      values[i] = value.SubString(0, 100);
  }
  //now do whatever you want with the values
}

为了避免常量反射(is string),您还可以使用读取器的模式信息来确定哪些是字符串列。