使用where子句选择查询,该子句需要一系列varchars

时间:2014-01-08 23:09:17

标签: sql sql-server-2008 stored-procedures where-clause varchar

这就是问题,我有一个存储过程,必须从数据库中选择产品,但只能选择适合开始产品代码和用户选择并发送到过程的完成产品代码的产品。

现在产品代码是varchars,它们可能包含数字和字母,例如0101B02A可能是产品代码,并且程序必须能够全部选择用户所选范围之间的值。

我遇到这样的where子句有问题:

...
SELECT ...
WHERE ... AND
 ProductCode >= @IniProCod
 AND 
 ProductCode <= @FinProCod
...

可用的产品代码通过之前的查询向用户显示,该查询仅返回可用的产品代码,因此不存在非存在值的问题。

我也尝试将它们作为文本进行评估,尽管它们仍被程序作为varchars接收,因为这是在动态SQL查询中,它实际上看起来像这样:

...
SELECT ...
WHERE ... AND
 ProductCode >= '''+@IniProCod+'''
 AND 
 ProductCode <= '''+@FinProCod+''''
...

当我尝试执行它时,它返回第一行或一组与我发送给程序的实际值几乎没有任何关系的行,所以我甚至不认为它是将值比较为字符串。

我遗漏了与问题无关的代码,如果没有这个范围的where子句,查询实际上可以正常工作。

所有想法?

修改

我也试过使用BETWEEN,但结果相同。

我非常肯定,即使它们被声明为varchars并且我在它们上使用了撇号,它也只是不将变量作为文本进行比较,而这只发生在这个过程中。我在一个干净的选择查询上测试了这个相同的子句,它确实表现得如此,比较每个字符的含义。如果我将初始值分别设置为029,它会给我一个范围从0129的范围,这是该范围内包含的值,但是当它们相同时值将被赋予存储过程,它将返回从01(第一个值)到03F的范围,这对我来说毫无意义。

1 个答案:

答案 0 :(得分:1)

最有可能的是,您需要让您的应用程序根据开始和时间计算出产品代码列表。结束代码,然后将该列表发送到存储过程。您的SQL只包含AND ProductCode IN (@myProductCodeList)

之类的内容