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。配列を渡す必要があります。

このタスクを実行する1つの方法は、テーブル値パラメーターを使用することです。

この記事の次の記事をご覧くださいSolution #3TSQL:配列/リスト/セットをストアドプロシージャに渡す(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

あなたの問題に対する最も簡単な解決策は、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また、使用が常に推奨されるとは限らないことに注意してください。私は遭遇しました

クエリ タイムアウト エラー

INIDが多い場合

于 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 に答える