大家好:  
      今天在维护项目的时候出现了一个严重问题。
      我们的数据库是sqlserver2008,开发是用的.Net+ibatis.库中有个表 主键字段类型是varchar, 在程序中有个查询语句根据主键查,主键叫userId,在ibatis配置文件中拼凑的查询条件是 where userId = #userid# ,结果导致查询时连接超时,后来找到公司的dba监控了一下,他说程序里做个转换改成 where userId = #userid:varchar# 这样就可以了,我们修改后还就真的没问题了。
     我想问下,这到底是为什么呢?是不是程序里传进来的参数是String类型 默认成了数据库中nvarchar 类型,但是在执行sql的时候 数据库要做个类型转换,将nvarchar转换为varchar 结果在做转换的时候导致连接超时????
     sqlserver内部是怎么实现类型转换的? 这对效率有多大的影响? 还是说是其他原因????
     求解~~~~~

解决方案 »

  1.   

        我网上又查了下,我想可能是因为数据库中做了隐式转换 将nvarchar转换成了varchar 导致了之前建立的索引失效了,又由于数据量很大 所以导致查询时间超时。 (以前没有出现可能是因为数据量小,索引失效也没有造成太大影响一直能用。)
      

  2.   

    关键问题是很多控件把字段默认当成nvarchar,要么在程序上显式指定类型,如果不支持的话要用convert转换下参数了(例:reportbuilder)
      

  3.   

    SQL Server 内部在遇到数据类型隐式转换时是将优先级低的类型转换为优先级高的类型。SQL Server 数据类型的优先级如下(自高到低):用户自定义类型、SQL_VARIANT、XML、DATETIME、SMALLDATETIME、FLOAT、REAL、DECIMAL、MONEY、 SMALLMONEY、BIGINT、INT、SMALLINT、TINYINT、BIT、NTEXT、TEXT、IMAGE、TIMESTAMP、UNIQUEIDENTIFIER、NVARCHAR、VARCHAR、NCHAR、CHAR、VARBINARY、BINARY。显然,由于 nvarchar 的优先级高于 varchar 的优先级,varchar 会隐式转换为 nvarchar。而在 lz 的表中 userId 转化为 nvarchar 类型后索引便会失效。