如何将项列表作为参数传递给存储过程

时间:2012-12-19 08:34:50

标签: sql-server-2008 stored-procedures

我有一个存储过程

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

我在这里通过订单清单......

当我像这样执行时

exec sp 'iss005,iss006'

我没有收到数据

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

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

然后我得到数据......

谢谢

3 个答案:

答案 0 :(得分: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()函数将引号添加到新变量。

答案 1 :(得分: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)
            )

除了使用商店程序输出外,我还建议使用功能,但这取决于您。 问候。

答案 2 :(得分: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