2013-07-29 68 views
2

我有一個c#程序,並希望給參數存儲過程。我的c#程序中的字符串就像「'食物','衣服','血液'」。SQL存儲過程IN子句varchar數組

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個條目,但結果是空的。我試圖用另外兩個參數來逃避參數,但結果沒有改變。

它與其他列上的int值一起使用,但不與字符一起使用。

如果有人能幫忙,那將是巨大的:)

回答

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 
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 
3

由於in clause適用於一組數據,因此您正在獲得空白結果集。 而你正在傳遞一個200字的單個字符串。 您的查詢實際上是比較子類別和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你的第二個等等。 如果你在@categoryfilter中有一組數據,用逗號(,)分隔,然後首先分割該字符串,然後使用IN Clause

0

嘗試修剪傳入的字符串 - > RTRIM(@string)。

如果你使用字符,你總是必須修剪。

1

試試這個

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

    DECLARE @QUERY VARCHAR(MAX) 
    SET @QUERY = 'SELECT * 
    FROM dbo.Locations 
    WHERE longitude BETWEEN @longMin AND @longMax 
     AND latitude BETWEEN @latMin AND @latMax 
     AND subCategory in ('''+RTRIM(@categoryFilter)+''')' 

    --PRINT (@QUERY) 

    EXEC (@QUERY) 


END 
+0

完美的作品,感謝幫助:) – Patrick

0

你可以嘗試如下

ALTER PROCEDURE [dbo].[GetLocations] 
    @longMax float =100, 
    @longMin float=0, 
    @latMax float=100, 
    @latMin float=0, 
    @categoryFilter char(200) = '', 
    @Query varchar(2000) 

AS 
BEGIN 
    SET NOCOUNT ON; 

    Set @Query = 'SELECT * 
      FROM dbo.Locations 
      WHERE longitude BETWEEN @longMin AND @longMax 
        AND latitude BETWEEN @latMin AND @latMax 
        AND @categoryFilter IN (' + LTRIM(RTRIM(@categoryFilter)) + ')' 

    Exec(@Query) 

END 
相關問題