Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Microsoft Access SQL中拆分字符串以与命令参数一起使用_Sql_Ms Access_.net 2.0 - Fatal编程技术网

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

在Microsoft Access SQL中拆分字符串以与命令参数一起使用,sql,ms-access,.net-2.0,Sql,Ms Access,.net 2.0,我正在使用MicrosoftAccess2000,需要传入一个逗号分隔的字符串参数。逗号分隔的字符串用于where语句的IN子句。这方面的一个例子是: SELECT * FROM Table1 WHERE Field1 IN (@MyValues) 其中@MyValues可能类似于1,2,3 但是,当我传入1,2,3时,Access参数似乎不接受输入。Access SQL中是否有一个好的拆分字符串函数可以解决此问题?还是有别的办法解决这个问题 作为我所做工作的参考,我尝试在.NET中使用参数化

我正在使用MicrosoftAccess2000,需要传入一个逗号分隔的字符串参数。逗号分隔的字符串用于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");

你能把它们放在另一个表中并进行连接吗

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

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

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

如果mdb中有一个参数化的查询,则可以使用.parameters集合,而mdb中没有。您的sql在源代码中。

您可以将它们放在另一个表中并进行联接吗

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

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

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

如果mdb中有一个参数化的查询,则可以使用.parameters集合,而mdb中没有。您的sql在源代码中。

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

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年。)

编辑
首先,你的问题看起来有点熟悉。然后它开始看起来很熟悉。然后我意识到不久前我也有同样的问题。我的解决方案是将参数放入此函数中:

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年。)

编辑 请参见以下内容:

  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 ",%"
我不确定这将如何执行,但它至少允许参数化。

这是什么:

  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 ",%"


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

我不想为此创建另一个表。这将使一个简单的解决方案变得复杂。上面为您添加了ADO代码。它从实际代码中得到了简化,但应该能够理解这一点。虽然该解决方案可行,但我还是希望使用一些体系结构目标,这就是我希望使用参数化SQL的原因。也就是说,我将所有SQL字符串移动到一个资源库中,这样就没有SQL直接驻留在一个类中,我可以将代码复制到Access中以验证SQL是否工作。您可以将参数化SQL与参数化查询一起使用。我会将sql保留在mdb中。我不想为此创建另一个表。这将使一个简单的解决方案变得复杂。上面为您添加了ADO代码。它从实际代码中得到了简化,但应该能够理解这一点。虽然该解决方案可行,但我还是希望使用一些体系结构目标,这就是我希望使用参数化SQL的原因。也就是说,我将所有SQL字符串移动到一个资源库中,这样就没有SQL直接驻留在一个类中,我可以将代码复制到Access中以验证SQL是否工作。您可以将参数化SQL与参数化查询一起使用。我会将sql保留在mdb中。Access“Jet数据库引擎不支持在(值列表)Access中为
使用参数”Jet数据库引擎不支持在(值列表)
中为
使用参数这看起来非常有趣。你知道执行计划吗?从函数的外观来看,它将从表1中获取所有内容,然后在整个表中循环以进行过滤器比较。这似乎成本很高,因为它绕过了数据库引擎查询结构。如果数组是从一个单独的表中提取的,那么Access必须为表1中的每条记录提取该数据一次。在这种情况下,性能可能是一个问题。但是,如果数组相对较小且存储在查询本身中,则不会花费太长时间。如果使用.Net连接到MDB,则查询不能使用在MDB中创建的用户定义函数。@HansUp,如果这是一个问题,则OP可以生成最终数据集的临时本地表。这看起来非常有趣。你知道执行计划吗?从函数的外观来看,它将从表1中获取所有内容,然后通过ent循环