Autor Beitrag
sou
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 03.10.06 18:16 
Hi,

gibt es eine Möglichkeit, einer Stored Procedure eine Liste von Werten zu übergeben?
In meinem Fall brauche ich diese Möglichkeit dafür, um eine Liste von IDs an die Datenbank zu übergeben.

Verwendete Datenbank: MS SQL Server 2000

MfG
sou
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 03.10.06 18:35 
Du meinst also eine unstimmte Anzahl von parametern? Man könnte sie ja in einen string mit Trennern einpacken.

_________________
Markus Kinzler.
sou Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 04.10.06 08:36 
Konkret möchte ich eine unbestimmte Anzahl an IDs an die SP übergeben.
Die Zahl der IDs kann zwischen 1 - n variieren.

Einen Parameter den ich als varchar angebe, kann ich natürlich einrichten,
aber ich müsste überprüfen, ob ich die Länge nicht überschreite und ich müsste
in der SP selbst den String parsen.

Gibt es eventuell eine andere Möglichkeit?
sou Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 04.10.06 08:41 
Ok, es gibt wohl keine andere Möglichkeit. :)

Andreas Kosch:
Zitat:

Hallo,
bei dieser Aufgabe wird üblicherweise eine Zeichenkette an die Stored Procedure übergeben, in der alle ID-Werte durch einen Separator (wie zum Beispiel ein Komma) unterteilt sind. Die Stored Procedure verwendet eine Funktion, um die ID-Liste in eine TABLE mit ID-Datensätzen umzuwandeln. Das folgende Beispiel demonstriert das Prinzip:
ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
USE tempdb

GO

 

-- Funktion splittet die Zeichenkette in eine TABLE auf

CREATE FUNCTION fnSplitCommaListToID

(

  @CommaList  VARCHAR(1000)

) RETURNS @IDTable TABLE(id INT)

AS

BEGIN

  DECLARE @FC int

  SET @FC = -1

  WHILE (Len(@CommaList) > 0)

    BEGIN

      SET @FC = CHARINDEX(',' , @CommaList)

      IF (@FC = 0) AND (LEN(@CommaList) > 0)

      BEGIN

        INSERT INTO @IDTable VALUES (CAST(@CommaList AS INT))

      BREAK

    END

    IF (@FC > 1)

      BEGIN

        INSERT INTO @IDTable VALUES (CAST(LEFT(@CommaList, @FC - 1) AS INT))

        SET @CommaList = RIGHT(@CommaList, (LEN(@CommaList) - @FC))

      END

    ELSE

      SET @CommaList = RIGHT(@CommaList, (LEN(@CommaList) - @FC))

  END

  RETURN

END

GO

 

-- Testdaten

CREATE TABLE TestTbl

(

  testtbl_id INT        NOT NULL IDENTITY PRIMARY KEY,

  wert       VARCHAR(9) NOT NULL

)

GO

INSERT INTO TestTbl (wert) VALUES('Test 1');

INSERT INTO TestTbl (wert) VALUES('Test 2');

INSERT INTO TestTbl (wert) VALUES('Test 3');

INSERT INTO TestTbl (wert) VALUES('Test 4');

INSERT INTO TestTbl (wert) VALUES('Test 5');

GO

 

-- Stored Procedure verwendet die Funktion, um die ID-Liste

-- in eine Ergebnismenge aus INT-Werten umzuwandeln

CREATE PROCEDURE spSplitCommaListToIDDemo

(

  @CommaList  VARCHAR(1000)

)

AS

  SET NOCOUNT ON;

  SELECT * FROM dbo.TestTbl

  WHERE testtbl_id IN (SELECT id FROM fnSplitCommaListToID(@CommaList));

RETURN @@ROWCOUNT;

GO

 

-- Stored Procedure testen

EXEC spSplitCommaListToIDDemo '2,4';

Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 04.10.06 09:02 
Bei Oracle gibt es Array-Parameter. Kennt MS-SQL vielleicht ein Äquivalent dazu?
Wenn nicht, hättest du vielleicht doch eine richtige Datenbank verwenden sollen... 8)

Stefan

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.