|
| 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
| |
|
|