2013-07-29 1 views
2

У меня есть программа C# и вы хотите указать параметр хранимой процедуры. Строка в моей программе C# похожа на «Продовольствие», «Одежда», «Кровь».SQL хранимая процедура IN clause varchar array

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