Avatar billede andymax Nybegynder
19. oktober 2000 - 23:39 Der er 3 kommentarer og
1 løsning

Multivalued/Array som parametrer til stored procedures

Nogen der har erfaring med at parse multivalued strings til stored procedures?
Avatar billede tigerdyr Nybegynder
20. oktober 2000 - 10:38 #1
No can do...
MS SQL Server snakker ikke med Arrays (dvs. den har ingen datatype der kan virke som Array og kan derfor heller ikke modtage et Array som parameter, du er nødt til at klare det som os andre og lave en satans masse parametre, et til hver plads i arrayet)
Avatar billede leander Nybegynder
24. oktober 2000 - 14:41 #2
Benyt et temporary table til at lægge værdierne ind i. Herefter kan du join\'e eller what ever med dette table. Eks.:

CREATE PROCEDURE multival
@idliste varchar(8000),
AS
DECLARE @index int
DECLARE @endindex int
DECLARE @string varchar(8000)
SET NOCOUNT ON

CREATE TABLE #TempTable (id INT PRIMARY KEY)
SET @index = 1
WHILE @index > 0
BEGIN
  SET @index = CHARINDEX(\',\', @idliste)
  IF @index <> 0
    SET @string = LEFT(@idliste, @index - 1)
  ELSE
    SET @string = @isliste

  IF @index <> 0
    SET @idliste = RIGHT(@idliste, LEN(@idliste) - (@index))
  INSERT INTO #TempTable VALUES (CAST(@string AS INT))
END

[... gør noget ...]

DROP TABLE #TempTable

Avatar billede leander Nybegynder
22. november 2000 - 10:16 #3
whoop, bedre måde at lægge værdierne ind i temp table\'t - den benytter text istedet for varchar, så du kan have lange lister:

CREATE PROCEDURE tool_idtable
@idlist text,
@separator char(1)
AS
DECLARE @start int
DECLARE @end int

SET NOCOUNT ON
CREATE TABLE #idtable (id INT PRIMARY KEY)
SET @start = 0
SET @end = 0
WHILE (1 = 1)
BEGIN
    SET @start = @end + 1
    SET @end = CHARINDEX(@separator, @idlist, @start)

    IF @end > 0
        INSERT INTO #idtable VALUES (CONVERT(INT, SUBSTRING(@idlist, @start, @end - @start)))
    IF @end = 0
    BEGIN
        INSERT INTO #idtable VALUES (CONVERT(INT, SUBSTRING(@idlist, @start, DATALENGTH(@idlist) - @start + 1)))
        BREAK
    END
END
SET NOCOUNT OFF
SELECT * FROM #idtable
DROP TABLE #idtable

Kaldes med

exec tool_idtable \'123,456,789,233341\', \',\'

eller kan lægges ind i en stored procedure, så du kan genbruge tablet...
Avatar billede andymax Nybegynder
20. december 2000 - 23:30 #4
Yo, ikke for at træde i det men det her er en del mere optimalt. Dels slipper man for det overhead der er i en temporary table og så laver query optimizeren heller ikke OR optimization.

CREATE PROCEDURE get_postnr
    @idlist VARCHAR(4000)
AS

SELECT Postnr
FROM Postnr
WHERE CHARINDEX(\',\' + CONVERT(VARCHAR(10), Postnr) + \',\', \',\' + @idlist + \',\') > 0


get_postnr \'800,900\'
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester