我有一个存储过程
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')
然后我得到数据......
谢谢
答案 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