我正在开发一个从 MS SQL Server 2008 或 2008 R2 服务器读取值的 C# 项目。
查询看起来像这样:
string charge="1234567";
string command = string.Format("SELECT * FROM tableX WHERE chargeField = '{0}' ", charge);
chargeField 来自 nvarchar(50) 类型 - 不要问我为什么 - 我无法更改数据库。 此外,条目是通过另一个我也无法更改的工具写入数据库的。 有时 chargeField 值中会有前导或结束空格字符,所以我的 查询将不返回任何内容,因为 "1234567"!= "1234567 "
但是,当我这样写查询时(没有' '):
string command = string.Format("SELECT * FROM tableX WHERE chargeField = {0} ", charge);
它有效。为什么这甚至可以工作 - 我不需要''符号来指示数据库字段是一个字符串吗?我可以安全地更改所有查询吗?这是 MS SQL Server 的“功能”吗?这里到底发生了什么。
编辑
我通过使用解决了这个问题:
string command = string.Format("SELECT * FROM tableX WHERE RTRIM(LTRIM(chargeField)) = {0} ", charge);
谢谢。
最佳答案
SQL Server 尝试相应地转换字段。如果没有引号,您将传递一个数字,因此 SQL Server 会尝试将 chargeField
中的值转换为一个数字,尽管前导空格仍然有效。
如果 chargeField
包含值 12345a
,这将不起作用。这将导致转换错误。表中的一条记录包含这样的值就足以导致错误。
为了安全起见,将您的查询更改为
... WHERE LTRIM(chargeField) = '{0}'
但请注意,这会导致不再使用字段上的可能索引。您仍然可以做的是创建一个附加列,该列使用值为 LTRIM(chargeField)
的触发器填充,在该列上放置一个索引并调整您的 WHERE
子句相应地。
关于c# - MS SQL nvarchar id 字段包含空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13742963/