0

我有一个存储过程,它具有使用“IN”关键字的 where 条件。所以我想向存储过程发送多个值。

这是我的存储过程:

ALTER PROCEDURE [dbo].[xxx]
   @COM_KEY varchar(max) = NULL
AS
BEGIN
    SELECT     
       UserName, UserId
    FROM 
       company        
    WHERE      
       (COM_KEY IN (@COM_KEY))
END

所以我在这里传递值

string companyID = "";

for (int i = 0; i < lbCompanies.Items.Count; i++)
{
    if (i == 0)
    {
        companyID += Convert.ToInt32(lbCompanies.Items[i].Value);
    }
    else
    {
        companyID += "," + Convert.ToInt32(lbCompanies.Items[i].Value);
    }
}

DataSet ApproveList = DataRepository.TUsersProvider.xxx(companyID);

但有一个错误

将 varchar 值 '3087,4058' 转换为数据类型 int 时转换失败

我该如何解决?

4

4 回答 4

4

您不能将逗号分隔的字符串传递到@COM_KEY. 你应该传递一个数组。

完成此任务的一种方法是使用表值参数

看看这篇文章,在Solution #3TSQL: Passing array/list/set to stored procedure (MS SQL Server)下。

本质上,您将您的一系列ints 视为您应用的表JOIN ,而不是通过WHERE ... IN ()短语查询它。

于 2013-02-26T06:33:47.837 回答
1

您可以创建一个UserDefinedFunction解析字符串并将提取的每个整数放入表中以解决此问题

CREATE Function fnSplitter (@IDs Varchar(100) )  
Returns @Tbl_IDs Table  (ID Int)  As  

Begin 
 -- Append comma
 Set @IDs =  @IDs + ',' 
 -- Indexes to keep the position of searching
 Declare @Pos1 Int
 Declare @pos2 Int

 -- Start from first character 
 Set @Pos1=1
 Set @Pos2=1

 While @Pos1<Len(@IDs)
 Begin
  Set @Pos1 = CharIndex(',',@IDs,@Pos1)
  Insert @Tbl_IDs Select  Cast(Substring(@IDs,@Pos2,@Pos1-@Pos2) As Int)
  -- Go to next non comma character
  Set @Pos2=@Pos1+1
  -- Search from the next charcater
  Set @Pos1 = @Pos1+1
 End 
 Return
End

现在像这样改变你的存储过程

ALTER PROCEDURE [dbo].[xxx]
@COM_KEY varchar(max) = NULL
AS
BEGIN
 SELECT UserName, UserId
 From company        
 WHERE COM_KEY IN (Select ID From dbo.fnSplitter(@COM_KEY))
END

检查此链接以获取详细的实现

于 2013-02-26T06:42:43.520 回答
0

您的问题最简单的解决方案是 vale SQL 字符串(用于动态查询),然后执行语句

ALTER PROCEDURE [dbo].[xxx]
   @COM_KEY varchar(max) = NULL
AS
BEGIN
DECLARE @SQL nvarchar(MAX)

SET @SQL=N'    SELECT     
       UserName, UserId
    FROM 
       company        
    WHERE      
       (COM_KEY IN ('+@COM_KEY+'))'
EXCE @SQL
END

@ ssilas777 提到的解决方案是相同的复杂版本。

另请注意,IN并不总是建议使用。我遇到了

查询超时错误

什么时候IN有很多ID

于 2013-02-26T07:05:35.327 回答
-3

更改您的代码:

if (i == 0)
{
  companyID += Convert.ToInt32(lbCompanies.Items[i].Value);
}
else
{
  companyID += "," + Convert.ToInt32(lbCompanies.Items[i].Value);
}

至:

if (i == 0)
{
  companyID +="'" + Convert.ToInt32(lbCompanies.Items[i].Value) + "'";
}
else
{
  companyID += ",'" + Convert.ToInt32(lbCompanies.Items[i].Value) + "'";
}
于 2013-02-26T06:41:57.650 回答