200分请教SQL中in参数在存储过程中的传递问题?
比如有一个SQL
SELECT * FROM SELTEXT WHERE ID IN (1,2,3,4)
我希望创建一个存储过程
比如:
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
SELECT * FROM SELTEXT WHERE ID IN (@P_0)
创建此存储过程没有问题,执行时总是有错误,
请教是什么问题,解决问题200分相送,另不打算使用临时表,有没有其他办法。
------解决方案--------------------提供几种方法
如果一个SQL语句中
select a,b,c from table_name where a in(2,3,4,5) ;
如果a是数值型,且2,3,4,5是变化的时候,可以用两种方法来解决这个问题:
第一种方法:如果2,3,4,5是固定的个数,比如有四个,可以定义四个变量,如果当其中只有两个变量的话,则把其余的两个变量设置为可能存在的值。
第二种方法:可以直接定义个字串,把2 3 4 5 赋值给它,比如说 str= '2,3,4,5 ' 或者 str= '2,3,5 ',然后在SQL语句中直接 in(:str)就可以了。系统会默认的把str当成三个数值或者四个数值来处理。
第三种方法:可以用instr来实现,instr( '2,3,4,5 ',to_char(a))> 0 其中 '2,3,4,5 '同样是一个字符串变量。如string str str= '2,3,4,5 '。 即 instr(:str,to_char(a)).
OK!
------解决方案--------------------如果能不在存储过程中使用Exec执行动态语句就不使用.
------解决方案--------------------proc更重要的一点是减少客户端的代码开发量
------解决方案--------------------procedure减少sql语句的传输量,少占网络带宽,少用传输时间。
直接使用sql语句则将sql耦合到程序中。但存储过程也有移植和维护的问题。
其实说这么多都是废话,没有完美的方法。你选择一种方法,总能找到它的好处,
不选择一种方法,总能找到它的坏处。还是爱咋的咋的,自己心里舒服就行。