3

我有一个存储过程

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

在这里,我正在传递订单列表....

当我这样执行时

exec sp 'iss005,iss006'

我没有得到数据

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

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

然后我正在获取数据...

谢谢

4

3 回答 3

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()函数将引号添加到新变量中。

于 2012-12-19T08:37:59.443 回答
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)
            )

除了使用存储过程输出之外,我还建议使用函数,但这取决于你。问候。

于 2013-10-09T18:39:20.457 回答
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
于 2016-12-30T11:08:07.190 回答