Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przekazanie parametrów do procedury dla klauzuli IN
jajcarzd1
post 5.07.2010, 11:01:34
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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

Ten post edytował jajcarzd1 5.07.2010, 11:02:30


--------------------
My mind is glowing ...
Jeśli pomogłem push the button :)
Go to the top of the page
+Quote Post
john_doe
post 9.07.2010, 00:05:37
Post #2





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

Ostrzeżenie: (0%)
-----


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)

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 17.06.2025 - 12:24