在Microsoft Access SQL中拆分字符串以与命令参数一起使用

时间:2010-11-02 16:01:26

标签: sql ms-access .net-2.0

我使用的是Microsoft Access 2000,需要传入一个以逗号分隔的字符串参数。逗号分隔的字符串用于where语句的IN子句。这方面的一个例子是:

SELECT * FROM Table1 WHERE Field1 IN (@MyValues)

其中@MyValues可能类似于1,2,3

但是,当我传入1,2,3时,Access参数似乎不接受输入。 Access SQL中是否有一个很好的拆分字符串函数可以解决这个问题?或者还有另一种解决这个问题的方法吗?

关于我正在做的事情的参考,我试图在.NET中使用参数化的SQL来获得结果集。

修改 下面是一些可以调用此查询的简化.NET代码示例:

OleDbCommand cmd = new OleDbCommand("SELECT * FROM Table1 WHERE Field1 IN (@MyValues)");
cmd.Parameters.Add("@MyValues","1,2,3");

3 个答案:

答案 0 :(得分:2)

这个怎么样:

  SELECT * FROM Table1 WHERE @MyValues Like "%" & Field1 "%"

这应该检查字段中的值是否包含在@MyValues参数的子字符串中。现在,如果@MyValues中的任何单个值都是彼此的子串,这可能会有问题:

  SELECT * FROM Table1 WHERE "2, 5, 10" Like "%" & Field1 "%"

在这种情况下,Field1中的“1”会匹配,但不应该匹配。因此,您可能需要格式化数字或以其他方式划分它们,例如:

  SELECT * FROM Table1 WHERE " 2 5 10 " Like "% " & Field1 " %"

或者,或者:

  SELECT * FROM Table1 WHERE ", 2, 5, 10," Like "%, " & Field1 ",%"

我不确定这会如何执行,但它至少会允许参数化。

答案 1 :(得分:1)

起初,你的问题看起来有点熟悉。然后它开始看起来非常熟悉。然后我意识到我不久前有同样的问题。我的解决方案是将参数投入此函数:

Public Function IsIn( _
  ByVal value As Variant, _
  ParamArray theset() As Variant) _
  As Boolean

  Dim i As Long

  For i = LBound(theset) To UBound(theset)
    If value = theset(i) Then
      IsIn = True
      Exit Function
    End If
  Next
End Function

在示例SQL代码中,您可以执行以下操作:

 SELECT * FROM Table1 WHERE IsIn(Field1,array(1,2,3))=true;

(和你一样,我也认为像这样的程序应该已经内置到Access中。也许是在2007年或2010年。)

修改

请参阅Is there a NotIn("A","B") function in VBA?

答案 2 :(得分:0)

你能把它们放在另一张桌子上并加入吗?

如果您不想创建另一个表,那没关系。您的ADO代码和查询语法是什么样的?

从上面编辑的代码中,我认为您不需要使用cmd对象的参数集合。只需修改您的sql以嵌入您的参数值:

OleDbCommand cmd = new OleDbCommand("SELECT * FROM Table1 WHERE Field1 IN (1,2,3)");

如果在mdb中有参数化查询,则不会使用.parameters集合。你的sql是源代码。