日期:2014-05-19  浏览次数:20699 次

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耦合到程序中。但存储过程也有移植和维护的问题。
其实说这么多都是废话,没有完美的方法。你选择一种方法,总能找到它的好处,
不选择一种方法,总能找到它的坏处。还是爱咋的咋的,自己心里舒服就行。