1

ストアドプロシージャがあります。この手順には、次のようなコードがあります。

...WHERE someParam IN (1,2)...

この部分を抽象化する必要があります。未定義の数のパラメーターを考慮する必要があるためです (1 または 2 だけではありません)。このパラメーター リストを vb.net コードから cvs 文字列 (つまり、"1,2" または "78, 109" など) として取得します。事実上、私の状況は次のようになります。

DECLARE @IdParam varchar(100)
SET @IdParam = '1,2'
...
...WHERE someParam IN (@IdParm)...

しかし、このコードは明らかにエラーを生成します:

varchar 値 '1,2' をデータ型 int に変換するときに変換に失敗しました。

目標を達成し、SQL エンジンを静かに保つにはどうすればよいですか? 最適なソリューションが存在する場合は、既存の VB コードを変更することを検討できます。

編集 1: リンクされた投稿の醜い解決策は使用しません。

4

2 に答える 2

3

複数の値を送信するには、テーブル値パラメーターを使用します。

CREATE PROC foo
   @IDList SomeType READONLY
AS
...
    WHERE someParam IN (SELECT ID FROM @IDList )
...
GO
于 2013-05-31T15:00:50.917 に答える
2

文字列をリストに変換する関数を作成できます...

ALTER FUNCTION [dbo].[fn_MVParamToInt](@RepParam nvarchar(max), @Delim char(1)= ',')
RETURNS @VALUES TABLE (Param int)AS
   BEGIN
   DECLARE @chrind INT
   DECLARE @Piece nvarchar(max)
   SELECT @chrind = 1
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@RepParam)
         IF @chrind > 0
            SELECT @Piece = LEFT(@RepParam,@chrind - 1)
         ELSE
            SELECT @Piece = @RepParam

         IF ISNUMERIC(@Piece) = 1
            INSERT @VALUES(Param) VALUES(CAST(@Piece AS int))

         SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
         IF LEN(@RepParam) = 0 BREAK
      END
   RETURN
END

次に、クエリは次のようになります...

...WHERE mycolumn IN (SELECT Param FROM dbo.fn_MVParamToInt(yourstring, '.'))
于 2013-05-31T14:59:31.540 に答える