我有个SQL in 使用参数传递怎么弄?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我有个SQL in 使用参数传递怎么弄?相关的知识,希望对你有一定的参考价值。

我先有个存储过程。。是用select * from 表名 where 字段名 in (@param),现在我给参数传递一个字符串。。怎么查询不到数据。。这个怎么解决啊?因为我传入的是一个字符串了。。所以没有效果。当然我这个参数是事先就声明好的,,那位老兄给小弟解决一下啊
ALTER proc [dbo].[UP_showreport@paramcode varchar(225),/*公司数组**/
@TargeCode varchar(150)/**指标代码*/
as
begin
select c.corpName as f1,f.TargetValue as f2 into #tabs from factTarget as f inner join corp as c on c.corpCode=f.CoprCode where f.TargetCode=@TargeCode and f.CoprCode in(@paramcode) order by Convert(float,TargetValue);
insert into #tabs(f1,f2) select '平均值', avg(convert(float,TargetValue)) from factTarget where TargetCode=@TargeCode and CoprCode in(@paramcode) ;
insert into #tabs(f1,f2) select '最小值', min(convert(float,TargetValue)) from factTarget where TargetCode=@TargeCode and CoprCode in(@paramcode);
insert into #tabs(f1,f2) select '最大值', max(convert(float,TargetValue)) from factTarget where TargetCode=@TargeCode and CoprCode in(@paramcode);
select f1 ,f2 from #tabs;
这是我的存储过程。。怎么可以拼接SQL啊。。。一直传入一个字符串不行
drop table #tabs;
end

declare @sql varchar(2000)
declare @param varchar(2000)
set @sql = \'select * from table where col in (\' + @param + \')\'
exec (@sql)
参考技术A in
从句不是那么用的,你传个字符转进去不能直接放在那个地方,需要在存储过程中重组sql语句,然后用系统提供的存储过程来执行这个语句
参考技术B 你是写的存储过程,还是代码里面拼sql的?

使用“IN”命令将数组作为要在 SQL 查询中使用的参数传递

【中文标题】使用“IN”命令将数组作为要在 SQL 查询中使用的参数传递【英文标题】:passing an Array as a Parameter to be used in a SQL Query using the "IN" Command 【发布时间】:2013-08-29 20:47:45 【问题描述】:

大家下午好,

我有一个关于 SQL 查询的问题。是否可以使用“IN”命令将数组用作查询的参数?

例如,

int x = 2,3,4,5

UPDATE 'table_name' set 'field' = data WHERE field_ID IN (x)

我问这个的原因是当我必须更新数据库中的数据时避免迭代 SQL 语句。 我还想过在 UPDATE 查询中使用 for each 语句,但我不知道如果更新 100 多条记录会减慢系统速度,是否会影响查询的性能。

我正在使用 VB.Net 顺便说一句。 我的数据库是 MySQL Workbench。

【问题讨论】:

从数组字符串生成 (2, 3, 4, 5) UPDATE ... WHERE ID IN cond REPLACE string cond on string get from array 所以我需要先将我的整数数组转换为字符串,这就是你的意思吗? 是的。 Mysql不支持array-parameters和table-parameters。 @realnumber3012,使用纯 sql 可能会导致 sql 注入,所以我认为 Law 正在寻求一种适当的方法来解决 IN 语句的情况 @Rex 正确,先生。顺便说一句,2,3,4,5 只是一个示例,数组可以是任意大小,具体取决于选择的数量 【参考方案1】:

如果您在变量(不是存储过程)中有查询并且没有大量 id,则可以构建自己的 IN。我还没有测试过这种方法的速度。

这段代码不会编译,只是给你一个想法。

query = "SELECT * FROM table WHERE col IN ("

For t = 0 TO x.Length-1
    If t > 0 Then query &= ","

    query &= "@var" & t
Next

query &= ")"

...

For t = 0 TO x.Length-1
    cmd.Parameters.Add("@var" & t, SqlDbType.Int).Value = x(t)
Next

【讨论】:

【参考方案2】:

我不熟悉 mySQL,但是在处理 MSSQL 时,我通常在 DB 中有一个拆分函数,以便我可以使用它在 VB 端将连接的整数值拆分为一个表,例如:

        Dim myIds = 1, 2, 3, 4
        Dim sql = <sql>                          
                    SELECT m.* FROM dbo.tblMyData m
                    INNER JOIN dbo.fncSplitIntegerValues(@Ids, ',') t ON t.id = m.Id
                  </sql>.Value

        Using con As New SqlConnection("My connection string..."),
            cmd As New SqlCommand(sql, con)

            cmd.Parameters.Add("@Ids", SqlDbType.VarChar).Value =
                myIds.Select(Function(m) m.ToString).Aggregate(Function(m, n) m & "," & n)

            con.Open()

            Dim rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            While rdr.Read()
                Console.WriteLine(rdr.GetValue(0))
                ' do something else...
            End While

        End Using

dbo.fncSplitIntegerValues 是一个 db 函数,用于将连接的整数 varchar 拆分为具有给定分隔符的整数 Id。

重要的是不要使用普通的 sql,而是使用 sql 参数。

注意:以上样本未经测试...

【讨论】:

我的想法是将元素转换为字符串,以便将其传递给查询。感谢您的帮助。【参考方案3】:

我已经得到了答案。我只需要将每个元素转换为字符串,然后将其与每个元素的“,”连接起来。所以我将传递的参数将是一个字符串。

回答: 诠释 x = 2,3,4,5 会变成 字符串 x = "2,3,4,5"

我的查询字符串将变为“UPDATE tablename SET field=value WHERE ID IN("&x&")”

感谢所有帮助过的人。

【讨论】:

以上是关于我有个SQL in 使用参数传递怎么弄?的主要内容,如果未能解决你的问题,请参考以下文章

在 jasperreport 中传递 SQL“IN”参数列表

SQL中in参数在存储过程中传递及使用的方法

在 Sql Server 中将集合作为参数传递时使用 IN 子句

SQL Server SP - 为“IN”数组列表传递参数?

调用.sql文件有没有比较好的参数传递方法

SQL IN 逗号分隔参数与内部查询