Hej! Du vill alltyså dynamiskt ange ett antal olika sökkriterier. det finns ett antal mer elelr mindre bra sätt att göra det. Tex kan man ange param1, parma2, param3 osv till så många som man kan ha (att det är en otroligt korkad lösning hoppas jag framgår ;-)). För att lösa det så i en SP måste du använda executeFnuttar inparameter
Jag vill skicka en sträng in till en storedprocedure som väljer ut enligt mina kriterier i strängen.
Jag fattar inte riktigt hur jag ska skriva för att det som tolkas rätt?
Del av sp:n:
WHERE [Place] IN(@Ort)
En "vanlig" IN ser juh ut såhär: IN('xx','xx','xx')
Hur ska jag bygga upp min sträng så att den kan användas som inparameter i sp:n?
/TjockeSv: Fnuttar inparameter
Jag föredrar att skicka in XML-dokument med sökvillkor och det skulle då kunna set ut så här
<code>
CREATE Procedure GetStuffyByStatus(@StatusCodes ntext = null) /* kan även skickas som varchar */
DECLARE @XmlHandle int
IF @StatusCodes IS NOT NULL
BEGIN
CREATE TABLE #status(IDStatus int)
EXEC sp_xml_preparedocument @XmlHandle OUTPUT, @StatusCodes
insert into #status
SELECT status
FROM OPENXML (@XmlHandle, '/root/Item',1) WITH (staus int)
EXEC sp_xml_removedocument @XmlHandle
select * from order where statusid in [(select distinct(IDStatus) from #status )]
END
ELSE
BEGIN
select * from order
END
</code>
Och ett XMLdokument som ser ut ungefär så här:
<code>
XMLdokumentet ser ut så här (ungefär)
<root>
<Item status="1"/>
<Item status="2"/>
<Item status="3"/>
</root>
</code>
Ett anmat sät är att ta strängen du har och splitta upp dem och försöka få dem som parameter till IN-satsen.
EDIT:
För att svara på den egentliga frågan, "Hur ska jag bygga upp min sträng så att den kan användas som inparameter i sp:n? ". Skickar du in den som en sträng så blir det just det, det du får hitta på är någon anna fiffig lösning, tex skicak in ett XML-dokument, ha separatorer i din tex och sedan splitta upp den till någon sorts array i din SP och skicka den som parameter. Sv: Fnuttar inparameter
typ
declare @ID_Lista varchar(8000)
SET @ID_Lista = " 'aa','bb', 'cc' "
execute ('SELECT * FROM T WHERE X IN(' + @ID_Lista + ')' )
Det fungerar bra men det finns två nackdelar.
1. Stored proceduren kan inte optimeras på samma sätt som vanliga
då det är dynamisk SQL som körs. Oftast är det inget stort problem.
2. Du blir begränsad till en 8000 tecken lång lista i det här fallet.
(kan man komma runt genom att ha IDLista1 + IDLista2 .. osv).
Ett annat alternativ som jag har sett är att man stoppar in den komma-separerade listan i en User Defined Function, som splittar upp, insertar i en temporär table-variabel, och returnerar denna som input till IN(). Det kan låta dyrt men det kostar ju mer att från klienten göra 1000 anrop till databasen...
Marcus förslag med XML är snyggare, så om du har tid tycker jag du ska kolla på det.