/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MSSQl 2k: CVS-streng som parameter til SP
Fra : Jesper Stocholm


Dato : 13-02-04 14:35

Jeg har en stored procedure, som i princippet virker som

CREATE PROCDURE MyUser.Proc1

@columnFilter_ CHAR(50)

AS
SELECT * FROM Table1 WHERE Column1 IN (<mit filter>)

Column1 er en CHAR-kolonne, og jeg vil gerne have det, så den virker som

SELECT * FROM Table1 WHERE Column1 IN ('aa','ab','ac')

Jeg har forsøgt med

SELECT * FROM Table1 WHERE Column1 IN (@columnFilter_)

, men det virker kun, hvis jeg angiver input argument som

EXEC MyUser.Proc1 'aa'

Hvis jeg i stedet gør det som

EXEC MyUSer.Proc1 '''aa'',''ab'''

.... eller andre varianter, så matcher den ingen rækker.

Er det muligt at gøre, hvad jeg ønsker - uden at opbygge logik i min SP,
der kan omdanne fx 'aa,ab' til 'aa','ab' ?

--
Jesper Stocholm
http://stocholm.dk

 
 
Jens Gyldenkærne Cla~ (13-02-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-04 15:02

Jesper Stocholm skrev:


> SELECT * FROM Table1 WHERE Column1 IN (@columnFilter_)

Prøv med

EXEC ('SELECT * FROM Table1 WHERE Column1 IN (' +
       @columnFilter + ')'
   )
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (13-02-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-02-04 15:47


"Jens Gyldenkærne Clausen" wrote
> Jesper Stocholm skrev:
>
> > SELECT * FROM Table1 WHERE Column1 IN (@columnFilter_)
>
> Prøv med
>
> EXEC ('SELECT * FROM Table1 WHERE Column1 IN (' +
> @columnFilter + ')'
> )

Nemlig og det virker fint
Men hagen ved det er så at man mister nogle af fordelene ved SP's

- Peter



Jesper Stocholm (13-02-2004)
Kommentar
Fra : Jesper Stocholm


Dato : 13-02-04 16:29

"Peter Lykkegaard" <polonline@hotmail.com> wrote in news:xq5Xb.3281$Xq3.389
@news.get2net.dk:

>
> "Jens Gyldenkærne Clausen" wrote
>> Jesper Stocholm skrev:
>>
>> > SELECT * FROM Table1 WHERE Column1 IN (@columnFilter_)
>>
>> Prøv med
>>
>> EXEC ('SELECT * FROM Table1 WHERE Column1 IN (' +
>> @columnFilter + ')'
>> )
>
> Nemlig og det virker fint
> Men hagen ved det er så at man mister nogle af fordelene ved SP's

Ja, og det er faktisk ikke noget, som jeg kan ignorere i denne situation.
Derudover skal jeg bruge det i nogle semi-komplekse procedurer, og her vil
jeg være gevaldigt ked af at skulle opbygge min SQL-streng eksplicit for
hvert run.

(det vil i øvrigt også være et helvede at skulle vedligeholde for
arvtageren af min kode :)

Tak for dit input, Jens ... trods alt :)

--
Jesper Stocholm
http://stocholm.dk

Peter Lykkegaard (13-02-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-02-04 20:18

Jesper Stocholm wrote:

> Ja, og det er faktisk ikke noget, som jeg kan ignorere i denne
> situation. Derudover skal jeg bruge det i nogle semi-komplekse
> procedurer, og her vil jeg være gevaldigt ked af at skulle opbygge
> min SQL-streng eksplicit for hvert run.
>
Hmmm, en tanke
Jeg spekulerer på om man kan smide dataene ind i en temp tabel og så bruge
denne tabel som grundlag for din where clause
Men det bliver nok at gå over åen efter vand

> (det vil i øvrigt også være et helvede at skulle vedligeholde for
> arvtageren af min kode :)
>
Arhh hold op, der skal da være plads til lidt udfordring i jobbet

- Peter




Lars Linde (04-03-2004)
Kommentar
Fra : Lars Linde


Dato : 04-03-04 16:35

> >> EXEC ('SELECT * FROM Table1 WHERE Column1 IN (' +
> >> @columnFilter + ')'
> >> )
> >

Jeg har altid brugt følgende:


Opret følgende i User Defined Functions:
=====================================================
CREATE FUNCTION strListToTable (
@list VARCHAR(8000),
@delimiter CHAR(1) = ','
)
RETURNS @tbl TABLE (str VARCHAR(8000)) AS

BEGIN
DECLARE @pos INT
DECLARE @tmpval VARCHAR(8000)

IF RIGHT(@list, 1) = @delimiter
BEGIN
SET @list = LEFT(@list, LEN(@list)-1)
END

SET @pos = CHARINDEX(@delimiter, @list)

WHILE @pos > 0
BEGIN
SET @tmpval = LEFT(@list, CHARINDEX(@delimiter, @list) - 1)
INSERT @tbl (str) VALUES(@tmpval)
SET @list = SUBSTRING(@list, @pos + 1, LEN(@list))
SET @pos = CHARINDEX(@delimiter, @list)
END

INSERT @tbl (str) VALUES (@list)
RETURN
END
=====================================================

Det skulle nu være muligt at køre det som du ønsker med denne her:

CREATE PROCDURE MyUser.Proc1
@columnFilter_ CHAR(50)
AS
SELECT * FROM Table1 WHERE Column1 IN (SELECT * FROM
intlistToTable(@columnFilter)))

Håber at det kan hjælpe

--
Lars Linde












Lars Linde (11-03-2004)
Kommentar
Fra : Lars Linde


Dato : 11-03-04 22:25


"Lars Linde" <someone@somewhere.com> skrev i en meddelelse
news:c27ia5$1tuc$1@news.cybercity.dk...
> > >> EXEC ('SELECT * FROM Table1 WHERE Column1 IN (' +
> > >> @columnFilter + ')'
> > >> )
> > >
>
> Jeg har altid brugt følgende:
>
>
> Opret følgende i User Defined Functions:
> =====================================================
> CREATE FUNCTION strListToTable (
> @list VARCHAR(8000),
> @delimiter CHAR(1) = ','
> )
> RETURNS @tbl TABLE (str VARCHAR(8000)) AS
>
> BEGIN
> DECLARE @pos INT
> DECLARE @tmpval VARCHAR(8000)
>
> IF RIGHT(@list, 1) = @delimiter
> BEGIN
> SET @list = LEFT(@list, LEN(@list)-1)
> END
>
> SET @pos = CHARINDEX(@delimiter, @list)
>
> WHILE @pos > 0
> BEGIN
> SET @tmpval = LEFT(@list, CHARINDEX(@delimiter, @list) - 1)
> INSERT @tbl (str) VALUES(@tmpval)
> SET @list = SUBSTRING(@list, @pos + 1, LEN(@list))
> SET @pos = CHARINDEX(@delimiter, @list)
> END
>
> INSERT @tbl (str) VALUES (@list)
> RETURN
> END
> =====================================================
>
> Det skulle nu være muligt at køre det som du ønsker med denne her:
>
> CREATE PROCDURE MyUser.Proc1
> @columnFilter_ CHAR(50)
> AS
> SELECT * FROM Table1 WHERE Column1 IN (SELECT * FROM
> intlistToTable(@columnFilter)))

UNDSKYLD!!
skal selvfølgelig være

CREATE PROCDURE MyUser.Proc1
@columnFilter_ CHAR(50)
AS
SELECT * FROM Table1 WHERE Column1 IN (SELECT * FROM
strListToTable(@columnFilter)))

og ikke intListToTable, det er en anden function som jeg også bruger meget.
Beklager fejlen.

> Håber at det kan hjælpe
>
> --
> Lars Linde



Jens Gyldenkærne Cla~ (13-02-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-04 15:50

Peter Lykkegaard skrev:

> Nemlig og det virker fint
> Men hagen ved det er så at man mister nogle af fordelene ved SP's

Ja. Det er lidt ærgerligt at man ikke kan køre forespørgsler med
variable sådan som Jespers oprindelige forsøg.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (13-02-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-04 22:54

Peter Lykkegaard skrev:

> Jeg spekulerer på om man kan smide dataene ind i en temp tabel
> og så bruge denne tabel som grundlag for din where clause

En lignende mulighed er at benytte en tabelvariabel (tabel i
hukommelsen).
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste