Výběr dat v SQL pomocí více kritérií a parametru   zodpovězená otázka

VB.NET

Mějme následující SQL dotaz:

SELECT Name

FROM Persons

WHERE (Id IN (1, 2, 3))

S použitím parametru by to bylo:

SELECT Name

FROM Persons

WHERE (Id IN (@Ids))

Lze nějak použít SqlCommand tak, aby akceptoval parametr s libovolným počtem hodnot bigint, abych nemusel SQL dotaz poskládat ručně, případně je nějaké jiné řešení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

obávám se, že do SQL parametru nelze zadat kolekci hodnot. Je však možné na úrovni databáze napsat funkci vracející tabulku jednotlivých hodnot kolekce parametru. Více na http://stackoverflow.com/questions/54016...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Našel jsem také, ale nemůžu použít. Protože SQL Server Compact Edition nepodporuje uložené procedury.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pak už mě napadá jedině něco takového:

Dim hledanaId() As Integer = New Integer() {1, 2, 3}
        Dim cmdText As String = "SELECT Name FROM Persons WHERE Id IN ({0})"
        Dim jmenaParametru(hledanaId.Count - 1) As String
        For i = 0 To hledanaId.Count - 1
            jmenaParametru(i) = String.Format("@par{0}", i)
        Next
        Dim inHodnoty As String = String.Join(",",jmenaParametru)

...

dim cmd As SqlCommand = New SqlCommand(String.Format(cmdText, inHodnoty))
            For i = 0 To hledanaId.Count - 1
                cmd.Parameters.AddWithValue(jmenaParametru(i), hledanaId(i))
            Next

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Table function:

CREATE FUNCTION MultiList_to_tbl (@list nvarchar(MAX))

RETURNS @tbl TABLE (NrDilu nvarchar(20) NOT NULL) AS

BEGIN

DECLARE @pos int,

@nextpos int,

@valuelen int

SELECT @pos = 0, @nextpos = 1

WHILE @nextpos > 0

BEGIN

SELECT @nextpos = charindex(',', @list, @pos + 1)

SELECT @valuelen = CASE WHEN @nextpos > 0

THEN @nextpos

ELSE len(@list) + 1

END - @pos - 1

INSERT @tbl (NrDilu)

VALUES (substring(@list, @pos + 1, @valuelen))

SELECT @pos = @nextpos

END

RETURN

END

Pouziti (ukazka je z me realne DB):

Poslu tam pole napr. INT (1,2,3) z parametru @Revize prevedene

do nvarchar(MAX), protoze predem neznam max. delku a ikdyz je to

INT, funguje to bez problemu

CREATE PROCEDURE [dbo].SP_LoadAuditByRevize

(

@Revize nvarchar(MAX)

)

AS

SELECT

ID_Audit,

Typ_Zmeny,

Zmenil_Audit,

Datum_Zmeny

FROM

Tbl_Doc15_Audit

JOIN MultiList_to_tbl(@Revize) i ON

Tbl_Doc15_Audit.Revize_Nr_Audit = i.NrDilu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je v podstatě to samé, co odkazuje Jiří Chovanec. Já jsem ale omezen tím, že nemohu použít uložené procedury.

Ještě se zeptám: Kolik do toho IN (v tomto případě @list) běžně posíláte hodnot?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vypadá to, že to vážně budu muset složit pomocí StringBuilderu. Podle MSDN to dělá problémy až při many thousands parametrech, což u mě rozhodně nehrozí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback