日期:2014-05-18  浏览次数:20487 次

100分请教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分相送,另不打算使用临时表,有没有其他办法。
另:
SELECT   *   FROM   SELTEXT   WHERE   ID   IN   (1,2,3,4)   中   1,2,3,4是变量,可以是任意值。。。

我把此贴设为100分只是想探讨一下学术上的事情,就是IN是否可以使用参数的问题,因为这个问题一直困扰我,并没有一个明确的答案,通过EXEC只是表面解决了问题,但是还是没有给我一个根本的概念,我并没有程序上无法解决的问题需要大家帮助,谢谢大家的帮助。


------解决方案--------------------
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
exec( 'SELECT * FROM SELTEXT WHERE ID IN ( '+@P_0+ ') ')
------解决方案--------------------
楼主在C#版问过这个问题吧.

我的建议就是把条件值做为一个字符串传到存储过程中,使用字符串拆分函数以次把每个值Insert到一个临时表中,然后使用Select 值 Form 临时表再使用IN.
------解决方案--------------------
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
begin
exec( 'SELECT * FROM SELTEXT WHERE ID IN ( '+@P_0+ ') ')
end
------解决方案--------------------
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
SELECT * FROM SELTEXT WHERE ID IN (@P_0)
这个存储过程写的有问题
@P_0假设传入的是 1,2,3,4
则@P_0的实际值是字符串 '1,2,3,4 '
因此实际查询的是:
SELECT * FROM SELTEXT WHERE ID IN ( '1,2,3,4 ')
如果ID是int类型。必然会抱错。其他类型的则不会查出结果

------解决方案--------------------
exec( 'SELECT * FROM SELTEXT WHERE ID IN ( '+@P_0+ ') ')
------解决方案--------------------
同意1/3楼的方法
------解决方案--------------------
也行,


CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
begin
SELECT * FROM SELTEXT WHERE charindex( ', '+cast(id as varchar)+ ', ', ', '+replace(@P_0, ', ', ' ' ', ' ' ')+ ', ') > 0
end

------解决方案--------------------
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
begin
declare @sql varchar(100)
set @sql = ', '+replace(@P_0, ', ', ' ' ', ' ' ')+ ', '

SELECT * FROM SELTEXT WHERE charindex( ', '+cast(id as varchar)+ ', ',@sql) > 0
end
------解决方案--------------------
是In不支持这种直接引用.
------解决方案--------------------
happyflystone(无枪的狙击手) ( ) 信誉:100 Blog 加为好友

方法好,测试了一下,觉得不错:)

------------------------------
declare @sql varchar(100)
set @sql = ',1,3,5,6,8, '

SELECT * FROM sysobjects WHERE charindex( ', ' + cast(id as varchar)+ ', ',@sql) > 0
------解决方案--------------------
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'INSelect2 ' AND TYPE = 'P ')
DROP PROCEDURE INSelect2