2012-12-19 122 views
3

我有一个存储过程如何通过项目作为参数列表存储过程

create PROCEDURE [dbo].[SP] 
(
    @OrderList varchar(500) 
) 
AS 
Begin 
    select * 
    from table 
    where id in ('+ @OrderList +') 

在这里,我路过orderlist ....

当我执行这样

exec sp 'iss005,iss006' 

我没有收到数据

但是当我硬编码像这样...

select * from table where id in ('iss005','iss006') 

然后我得到的数据...

谢谢

+0

是 - 当然 - 什么是你的问题? –

+2

当你对你的值进行“硬编码”时,你在** IN子句中提供了**列表**。然而,当你传递你的参数时,你提供**只有一个字符串**,它恰好包含逗号分隔的文本 - 但它仍然只是一个单一的字符串 - ** NOT **字符串列表为“IN”语句需要......您需要在答案中使用其中一种方法 - 将您的参数字符串变成**列表中的字符串列表** –

回答

5

不幸的是它不会这样的。如果你改变你的程序,类似于以下,这将工作:

Create Procedure dbo.SP 
    @OrderList varchar(500) 
AS 

Declare @SQL VarChar(1000) 

Select @SQL = 'SELECT * FROM table ' 
Select @SQL = @SQL + 'WHERE id in (' + @OrderList +')' 

Exec (@SQL) 

GO 

寻找更多的到你的查询,你的ID的价值varchar,所以程序会失败,因为你仍然可以得到:

WHERE id in (iss005,iss006)

当你想:

WHERE id in ('iss005','iss006')

你会甲肾上腺素编辑或者传递报价值,例如:

@OrderList = 'iss005','iss006'

或工作的一些SQL分裂@OrderList由逗号和使用QUOTENAME()功能引号添加到新的变量。

3

我强烈建议在这种情况下使用XML参数,会给你很大的灵活性。

你的XML可能是这样的

<ids> 
    <id>iss006</id> 
    <id>iss005</id> 
</ids> 

你的程序应该是这样的:

create PROCEDURE [dbo].[SP] 
(
    @OrderList XML 
) 
AS 
Begin 
    select * from table 
    where id in (
      select ParamValues.ID.value('.','VARCHAR(50)') 
        FROM @OrderList.nodes('/ids/id') as ParamValues(id) 
      ) 

除了使用存储过程输出的我也建议使用的功能,但是这是由你决定。 此致敬礼。

0

我有同样的要求。我得到一个int列表变量的用户列表,我需要获得这些用户的所有订单。我使用了一个非常简单的技巧来解决我的问题。请找到代码。

public DataTable GetAllOrderData(List<int> UserID) 
    { 
     try 
     { 
      string listofuser = String.Join(",", UserID.ToArray()); 
      SqlParameter[] parameters = new SqlParameter[] 
      {     
       new SqlParameter("@USERID", listofuser) 
      }; 
      return SqlDBHelper.ExecuteParamerizedSelectCommand("GetOrderByUserID", System.Data.CommandType.StoredProcedure, parameters); 
     } 
     finally { UserID = null; } 

    } 

,这是该存储过程

CREATE PROCEDURE [dbo].[GetOrderByUserID] (@USERID varchar(700)) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
Declare @SQL VarChar(1000) 
Select @SQL = 'SELECT *,ORM.OrganisationName FROM OrderTransaction ORT LEFT JOIN OrganisationMaster ORM ON (ORT.OrganisationID=ORM.OrganisationID) ' 
Select @SQL = @SQL + 'WHERE ORT.CreatedBy IN (' + @USERID +')' 

Exec (@SQL) 
END 
相关问题