比如有一个SQLSELECT * 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是变量,可以是任意值我把此贴设为200分只是想探讨一下学术上的事情,就是IN是否可以使用参数的问题,因为这个问题一直困扰我,并没有一个明确的答案,通过EXEC只是表面解决了问题,但是还是没有给我一个根本的概念,我并没有程序上无法解决的问题需要大家帮助,谢谢大家的帮助。

解决方案 »

  1.   

    不是不行 是根本就不行
    IN (1,2,3,4) 这里的1234分别表示4个不同的值
    而@P_0 就算 set @P_0=1,2,3,4   IN (@p_0)  @P_0  也只表示1个值. 其值是1,2,3,4 可以传入 1,2,3,4
    按,进行分割 
    分别连接进  IN (@1,@2,@3,@4)
    个数不确定 也只是个字符串处理问题个人意见欢迎拍砖
      

  2.   

    to:lizhizhe2000(武安侯)
    如用简单的办法建一个集合对象啊?
      

  3.   

    可在存储过程中拼接字符串,然后执行此字符串,类似于js中的eval
    PROCEDURE [dbo].[INSelect]
        @P_0 NVARCHAR(600)        
    AS
      DECLARE @A VARCHAR(6000)
      SET @A='SELECT * FROM testTb WHERE zip IN ('+@P_0+')'
      然后用系统存储过程sp_executesql执行@A即可!
      

  4.   

    例:
    CREATE PROCEDURE dbo.Update_Data
    @sqltxt         varchar(4000) --//需要执行的更新sql语句
    AS
    declare @sql nvarchar(4000)
    set @sql = @sqltxt
    exec sp_ExecuteSql   @sql --//其中sp_ExecuteSql 是系统自带的存储过程
      

  5.   

    另处MSDN有关于 sp_ExecuteSql   的详细用法!
      

  6.   

    to:cancerser(都是混饭吃,记得要结帖) 
    要是知道确切的数量就好了比如建个OR
    如where ID=@P_0 OR ID=@P_1 OR ID=@P_2 也成呵呵,问题是不知道确切的数量啊。。
      

  7.   

    TO:lizhizhe2000(武安侯)
    不想用EXEC
      

  8.   

    一、使用 sp_executesql 系统存储过程执行 Unicode 字符串
      1、直接组合 SQL 语句执行
      CREATE PROCEDURE p_Test1
      @TableName varchar(20)
      AS
      declare @SQLString nvarchar(200)
      set @SQLString = N'select * from ' + @TableName
      EXECUTE sp_executesql @SQLString
      2、SQL 语句里包含嵌入参数
      CREATE PROCEDURE p_Test2
      @TableName varchar(20),
      @UserID int,
      @UserName varchar(50)
      AS
      declare @SQLString nvarchar(200)
      
      set @SQLString = N'select * from ' +
      @TableName +
      N' where UserID=@UserID or UserName=@UserName'
      
      EXECUTE sp_executesql @SQLString,
      N'@UserID int, @UserName varchar(50)',
      @UserID, @UserName
      
      这也是 Microsoft SQL Server 的推荐做法。
      
      二、使用EXECUTE语句执行字符串
      CREATE PROCEDURE p_Test3
      @TableName varchar(20)
      AS
      declare @SQLString nvarchar(200)
      set @SQLString = N'select * from ' + @TableName
      EXEC(@SQLString)
      

  9.   

    sp_executesql 这个问题论坛上已经有人问过多次了
      

  10.   

    @P_0 NVARCHAR(600) 
    这个东西是个集合就可以了
      

  11.   

    你这里@P_0 NVARCHAR(600)只是一个参数,而in里面是一个集合,所以不会成功
      

  12.   

    不用知道数啊  武安侯 不就是这个思想?
    EXEC  得会用它啊
      

  13.   

    declare @sql nvarchar(4000)
    @sql = 'SELECT * FROM SELTEXT WHERE ID IN ('+@P_0+')'
    exec @sql
      

  14.   

    不想用EXEC
    ====
    你若一定不想用exec sp_ExecuteSql的话可以将建一个表变量或临时表, IN字符串拆分后放进去
    再SELECT * FROM SELTEXT WHERE ID IN (select id from @table)
    不就行了
      

  15.   

    IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'INSelect2' AND TYPE = 'P')
      DROP PROCEDURE INSelect2GO
    CREATE PROCEDURE [INSelect2]
        @P_0 NVARCHAR(600)        
    AS
    DECLARE   @sql varchar(100)
    set @sql = ','+@P_0+','    SELECT * FROM AAA WHERE  charindex( ','+cast(SL  as varchar)+',',@sql)  > 0
    EXECUTE INSELECT2  @P_0 = '60,10,20'
      

  16.   

    值多了看上去不是很好,不过要实现参数化。1。通过参数化查询,不写存储过程。有多少的值设置多少的SqlParameter对象,进行赋值组合添加到SqlCommand对象中,最后组合成查询语句。赋值的过程可以通过循环实现赋值。2。使用sp_executesql,这个楼上的已经说了。