我有个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 @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 Server 中将集合作为参数传递时使用 IN 子句