c# - MS SQL nvarchar id 字段包含空格

标签 c# sql sql-server database

我正在开发一个从 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/

相关文章:

sql-server - 如何修复 "Server name cannot be determined. It must appear as the first segment of the server' s dns 名称 (servername.database.windows.net)"

java - 使用 ExtlibX 访问 MSSQL 表单 Xpages 时出错 - 不支持驱动程序或 JVM

c# - 在 C# 中嵌套别名

c# - 与多点触控操作抛出异常相关的未记录的 .NET 代码

c# - 如何在Mongo中高效创建WriteModel列表?

sql - LINQ-to-SQL 存储库模式尝试有效,但担心分离

sql - 具有动态谓词的表的最佳索引

c# - 组合框绑定(bind)来自 MVVM C#​​ 中两个不同类的两个不同属性

sql - 查找丢失的记录并返回相邻的记录 SQL

sql - 返回字符串 :postgresql 中的数字