2

私は ac# プログラムを持っていて、ストアド プロシージャにパラメータを与えたいと思っています。私の c# プログラムの文字列は、"'Food','Clothes','Blood'" のようなものです。

ALTER PROCEDURE [dbo].[GetLocations]
    @longMax float =100,
    @longMin float=0,
    @latMax float=100,
    @latMin float=0,
    @categoryFilter char(200) = ''
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM dbo.Locations
    WHERE longitude BETWEEN @longMin AND @longMax
      AND latitude BETWEEN @latMin AND @latMax
      AND subCategory in (@categoryFilter) 
END

結果には 3 つのエントリが表示されるはずですが、結果は空です。さらに 2 つの ' を使用してパラメーターをエスケープしようとしましたが、結果は何も変わりませんでした。

他の列の int 値では機能しますが、char では機能しません。

誰かが助けることができれば、それは素晴らしいことです:)

4

6 に答える 6

3

データのセットで動作するため、空白の結果セットが得られin clauseます。そして、200 単語の単一の文字列を渡しています。あなたのクエリは実際にsubCategoryとcategoryFilterを比較しています

次のようにセットを提供することにより、管理スタジオで明示的に試すことができます

SELECT *
FROM dbo.Locations
WHERE longitude BETWEEN @longMin AND @longMax
AND latitude BETWEEN @latMin AND @latMax
AND subCategory in ('abc','bcd','cde');

abc- 最初のカテゴリ フィルター、同様に bcd 2 番目など。コンマ (,) で区切られた @categoryfilter に一連のデータがある場合は、まずその文字列を分割してから使用しますIN Clause

于 2013-07-29T11:59:24.230 に答える
2

文字列パラメーターを分割する必要があると思います-

DECLARE @categoryFilter VARCHAR(200) = 'Food,Clothes,Blood'

SELECT t.c.value('.', 'VARCHAR(50)')
FROM (
     SELECT ID = CAST ('<M>' + REPLACE(@categoryFilter, ',', '</M><M>') + '</M>' AS XML)
) r 
CROSS APPLY ID.nodes ('/M') t(c)

あなたの質問 -

ALTER PROCEDURE [dbo].[GetLocations] 

@longMax FLOAT = 100,
@longMin FLOAT = 0,
@latMax FLOAT = 100,
@latMin FLOAT = 0,
@categoryFilter VARCHAR(200) = 'Food,Clothes,Blood'

AS
BEGIN
     SET NOCOUNT ON;

     SELECT *
     FROM dbo.Locations
     WHERE longitude BETWEEN @longMin AND @longMax
          AND latitude BETWEEN @latMin AND @latMax
          AND (
               @categoryFilter = '' 
               OR 
               subCategory IN (
                    SELECT t.c.value('.', 'VARCHAR(50)')
                    FROM (
                         SELECT ID = CAST ('<M>' + REPLACE(@categoryFilter, ',', '</M><M>') + '</M>' AS XML)
                    ) r 
                    CROSS APPLY ID.nodes ('/M') t(c))
          )

END
于 2013-07-29T11:56:13.740 に答える
0

次のように使用できます。

ALTER PROCEDURE [dbo].[GetLocations]
    @longMax float =100,
    @longMin float=0,
    @latMax float=100,
    @latMin float=0,
    @categoryFilter char(200) = ''
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM dbo.Locations
    WHERE longitude BETWEEN @longMin AND @longMax
      AND latitude BETWEEN @latMin AND @latMax
      AND @categoryFilter LIKE '%' + subCategory + '%'
END
于 2013-07-29T11:58:54.447 に答える