这是我的查询:
(不会返回值)
select * from T_VoucherHeaderEntry
where Vhe_VoucherNo = 'APV-1808-00160'
(将返回一个值)
Select * from T_VoucherHeaderEntry where Vhe_VoucherNo like 'APV-1808-00160%'
我尝试修剪我的第一个查询,但没有用。
答案 0 :(得分:1)
您似乎在存储的数据中还有其他控制字符,特别是回车和换行。这突出显示了问题,最终查询找到了当前受此 1 :
影响的所有行:;declare @t table (Val1 varchar(20))
insert into @t(Val1) values ('abc
'),('def')
select * from @t where Val1 = 'abc'
select * from @t where Val1 like 'abc%'
select * from @t where Val1 like '%
%'
因此,请修复您选择的那些行。接下来,在此列上添加CHECK
约束:
ALTER TABLE T_VoucherHeaderEntry
ADD CONSTRAINT CK_T_VoucherHeaderEntry_NoExoticChars
CHECK (Vhe_VoucherNo not like '%[^-A-Za-z0-9]%')
(这表示为双重否定,表示我们要不允许在提供的范围内输入任何字符。我们必须将-
放在第一个字符,以便按字面意义进行解释,而不是作为范围分隔符)
最后更新您的应用程序,以免首先尝试插入此类伪造数据。
1 第三个查询标识那些受CR
/ LF
问题特别影响的人。对于更通用的方法,一旦确定了要在检查约束中指定的适当字符范围,则使用相同方法的变体将查找不满足检查约束的行,以供您修复。
答案 1 :(得分:0)
如果您的Vde_VoucherNo
列包含此'APV-1808-00160'
值,则绝对可以在下面工作并返回数据
select * from T_VoucherHeaderEntry
where Vhe_VoucherNo = 'APV-1808-00160'
如果列值中有空格,则可以使用修剪功能
select * from T_VoucherHeaderEntry
where trim(Vhe_VoucherNo) = 'APV-1808-00160'
但是,如果您的列包含此值的模式APV-1808-00160
,那么like将会起作用,这是您的第二个查询
Select * from T_VoucherHeaderEntry
where Vhe_VoucherNo like 'APV-1808-00160%'
BTW注意到两个查询来自两个不同的表,所以这可能也是原因