我正在研究一个C项目,它从MS SQL Server 2008或2008 R2服务器读取值。
查询如下所示:

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子句。

10-05 21:34