首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

100分请问SQL中in参数在存储过程中的传递有关问题

2012-02-07 
100分请教SQL中in参数在存储过程中的传递问题?比如有一个SQLSELECT*FROMSELTEXTWHEREIDIN(1,2,3,4)我希望

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



GO
CREATE PROCEDURE [INSelect2]
@P_0 NVARCHAR(600)
AS
DECLARE @sql varchar(100)
set @sql = ', '+@P_0+ ', '

SELECT * FROM SELTEXT WHERE charindex( ', '+cast(id as varchar)+ ', ',@sql) > 0
[解决办法]
我觉得报错的可能是在参数中出现逗号,会把它当成多个参数,
解决方法:可以传人参数时用特殊字符隔开,在存储过程里再转变成逗号。
[解决办法]
自己看一下帮助就知道了
in后只能跟子查询所得的数据集,或用 ", "分隔的列表
数据集只有一个值时,列表中只有一个值时就能用变量,但此时意不大
变量不能传递列表,虽然能传递数据集(如表变量),但不能作存储过程的参数
所以你要的得不到,常用的处理方式有动态和“无枪的狙击手”彩用的方法
但用一句就可以了
charindex( ', ' + cast(id as varchar)+ ', ', ', '+@a+ ', ') > 0
[解决办法]
楼上的方法是正确的方法,我也经常用到这个方法
[解决办法]
up

热点排行
Bad Request.