Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazanie parametrów do procedury dla klauzuli IN
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
jajcarzd1
Witam

Mam takie problem. Otóż posiadam procedurę i chiałbym do niej przekazać jako parametr listę identyfikatorów (chodzi o nr ID pewnych rekordów). Niestety jeśli przekaże je w parametrze np.

  1.  
  2. SELECT
  3. ..
  4. WHERE
  5. ...
  6. AND TrP_GIDNumer IN (@GID_Numery)
  7.  


gdzie GID_Numery to wartość postaci np. 12356,125789,125478, no to niestety zapytanie nic mi nie zwraca. Jeśli wpisze te same wartości na sztwyno w zapytaniu czyli tak

  1. SELECT
  2. ..
  3. WHERE
  4. ...
  5. AND TrP_GIDNumer IN (12356,125789,125478)


no to wtedy jest ok. Czy ma to związek z jakimś konwertowaniem wartości będących w parametrze ? Sytuacja taka ma miejsce zarówno jeśli przekażę parametry przez php jak i odpalę zapytanie MSSQL Serwer Managment. Dodam że kolumna TrP_GIDNumer jest typu INTEGER natomiast parametr @GID_Numery mam zadeklarowany jako varchar żeby móc przekazać cały ciąg razem z przecinkami.

Będę wdzięczny za pomoc
Pozdrawiam





Użyłem takiej funkcji split

  1. CREATE FUNCTION SPLIT
  2. (
  3. @s nvarchar(max),
  4. @trimPieces bit,
  5. @returnEmptyStrings bit
  6. )
  7. returns @t TABLE (val nvarchar(max))
  8. AS
  9. begin
  10.  
  11. declare @i int, @j int
  12. SELECT @i = 0, @j = (len(@s) - len(REPLACE(@s,',','')))
  13.  
  14. ;with cte
  15. AS
  16. (
  17. SELECT
  18. i = @i + 1,
  19. s = @s,
  20. n = substring(@s, 0, charindex(',', @s)),
  21. m = substring(@s, charindex(',', @s)+1, len(@s) - charindex(',', @s))
  22.  
  23. UNION ALL
  24.  
  25. SELECT
  26. i = cte.i + 1,
  27. s = cte.m,
  28. n = substring(cte.m, 0, charindex(',', cte.m)),
  29. m = substring(
  30. cte.m,
  31. charindex(',', cte.m) + 1,
  32. len(cte.m)-charindex(',', cte.m)
  33. )
  34. FROM cte
  35. WHERE i <= @j
  36. )
  37. INSERT INTO @t (val)
  38. SELECT pieces
  39. FROM
  40. (
  41. SELECT
  42. case
  43. when @trimPieces = 1
  44. then ltrim(rtrim(case when i <= @j then n else m end))
  45. else case when i <= @j then n else m end
  46. end AS pieces
  47. FROM cte
  48. ) t
  49. WHERE
  50. (@returnEmptyStrings = 0 AND len(pieces) > 0)
  51. OR (@returnEmptyStrings = 1)
  52. OPTION (maxrecursion 0)
  53.  
  54. RETURN
  55.  
  56. end
  57.  
  58. GO


znalezionej na http://www.kodyaz.com/articles/sql-server-...t-function.aspx

w taki sposób i jakoś działa smile.gif

  1. ...
  2. IN (SELECT * FROM SPLIT(@GID_Numery,1,0))
  3. ...


choć jakby ktoś miał jakiś inny krótszy sposób to będę wdzięczny za info
john_doe
nie wiem dokładnie jakim sposobem wypełniasz Twoją zmienną gid numerami.
Bawiłeś się kiedyś kursorami?

można by napisać procedurę, która tworzy tabelkę tymczasową
następnie stworzyć kursor fast forward i w każdym przebiegu insertować gidnumer do tej tabelki i na końcu dać

select ble ble ble from cdn.traPlat smile.gif where trp_gidnumer in (select gid from tempTable)

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.