我一直在C#中做一个项目,在某个时候我需要比较两个文件名相同的字符串,
SELECT Hash
FROM Beamer.PackageDetailFile (NOLOCK)
WHERE FileName = '"+fileName+"' ;
这不起作用,表名和列名正确。然而,
SELECT Hash FROM Beamer.PackageDetailFile (NOLOCK)
这个代码给了我散列。
怎么了?请帮忙,谢谢。
问题解决了,fileName im调用的是目录路径而不是文件名,这就是问题所在。现在运行良好,为所有欢呼
查询本身应该是好的,尽管这是非常糟糕的做法,并且应该使用参数,即
WHERE FileName = @filename
并使用本地变量中的值向名为filename
的命令添加一个参数。
失败的原因:
- 病例敏感性;如果是CS,则
'abc'
不等于'AbC'
(如果是CI,则为) - 填充,即
[n]char(len)
与[n]varchar(len)
;[n]char(len)
在右边用空格填充,这可能会产生奇怪的结果 - unicode,即
N'{blah}'
与'{blah}'
-主要只是非ASCII"blah"的问题 - 长度修剪;如果该列为
[n]varchar(20)
,并且您的参数为80个字符长,则它将与该列中的修剪版本不匹配
我遇到的另一个问题是SQL server中列的长度。例如,如果数据库列为varchar(50),并且fileName超过50个字符,则比较将失败(您会发现存储在数据库中的文件名被截断)。在这种情况下,您可能应该将数据库列更改为更大的长度,或者只更改varchar(max)