Laden...

Select Maxwert from @Table

Erstellt von icolor vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.711 Views
I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 10 Jahren
Select Maxwert from @Table

verwendetes Datenbanksystem: <MS SQL 2010>

Morgen Leute,

ich möchte eine Prozedur erstellen, die mit für eine übergebene Tabelle den Maximalwert für ein Feld (ID) ausliest. Leider komme ich hier an meine Grenzen. Kann mir jemand weiterhelfen?


ALTER PROCEDURE [dbo].[GETNEWID]
(
	@TABLENAME	nvarchar(30)
)

AS

BEGIN
	DECLARE @cmd AS nvarchar(max)
	DECLARE @parms AS nvarchar(100)
	DECLARE @NEWD as nvarchar(10)
	SET @parms = N'@TABLENAME nvarchar(30)'
	SET @cmd = N'SELECT (ISNULL(MAX(ISNULL(ID, 0)), 0) + 1) FROM [' + @TABLENAME +']'

	EXEC sp_executesql @cmd, @parms, @NEWD 
	SELECT @NEWD
END

849 Beiträge seit 2006
vor 10 Jahren

Hallo icolor

Soweit ich weis funktionieren Parameter nur bei Werten, nicht bei Tabellennamen.
Ich denke Du wirst mit string.format oder ähnlichen Arbeiten müssen.

I
icolor Themenstarter:in
115 Beiträge seit 2008
vor 10 Jahren

mmh, sagt mir als Schlagwort jetzt nicht viel

Zumal die oben gezeigte Prozedur ja läuft. Nun sie gibt zwei Ergebnisse zurück und überschreibt somit das korrekte.

(Kein Spaltenname)
4

Return Value
0

849 Beiträge seit 2006
vor 10 Jahren

sorry mein fehler hab die Augen noch nicht richtig auf.. (Urlaub 😉 vergiss was ich gesagt habe.. war im falschen Film

656 Beiträge seit 2008
vor 10 Jahren

Versuchs mal mit SET NOCOUNT ON.

C
2.121 Beiträge seit 2010
vor 10 Jahren

Versuchs mal mit SET NOCOUNT ON.

Das wäre ein Befehl der zwar im Gegensatz zur geposteten Beispiel funktionieren würde, aber mit der Frage hat das ja wirklich gar nichts zu tun 😉

icolor:
was soll dein Code tun? Der erscheint mir sehr kompliziert.
Zweimal ISNULL? Da würde sicher auch nur eines reichen.
Das mit @parms, @NEWD ist auch irgendwie seltsam. Was soll das tun?

Versuch doch mal sowas:
DECLARE @x int
SET @cmd = N'SELECT @x = MAX(ID) + 1 FROM [' + @TABLENAME +']'
EXEC @cmd

ich weiß nicht ob das so mit @x funktioniert, glaube aber schon.
Dann kannst du dich um evtl. NULL als ID kümmern. Sollte aber trotzdem funktionieren, sonst schreibst du lieber noch WHERE ID IS NOT NULL mit rein.

3.511 Beiträge seit 2005
vor 10 Jahren

Hallo,

was willst du eigentlich genau erreichen? Sieht mir irgendwie danach aus, dass du eine Art Sequence nachbauen willst.

Wenn ja:
Hast du die Möglichkeit auf SQL 2012 umzusteigen? Denn dort gibt es Sequenzen frei Haus. Und warum das Ganze als Procedure und nicht Function? Zusätzlich musst du bei sowas darauf achten, dass du bei mehrmaligen Zugriff nicht die gleiche ID vergibst. D.h. wenn 2x hintereinander die SP aufgerufen wird, erhältst zu 2x die gleiche ID. Du musst also das Abrufen, Verwenden und Updaten in eine Transaktion packen.

Wenn nein:


DECLARE Tmp TABLE (Value INT)
INSERT INTO Tmp
EXEC sp_executesql @cmd, @parms, @NEWD

SELECT * FROM Tmp

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

656 Beiträge seit 2008
vor 10 Jahren

was willst du eigentlich genau erreichen? Sieht mir irgendwie danach aus, dass du eine Art Sequence nachbauen willst. int IDENTITY?

Vielleicht würde man auch leichter ans Ziel kommen, wenn man wüsste, was überhaupt der Sinn hinter dem "max ID holen" ist.

3.511 Beiträge seit 2005
vor 10 Jahren

Sequence != Identity.

Ich bin jetzt davon ausgegangen, dass icolor weiß was Identities sind. Aber was genau das bezwecken soll, kann uns wohl nur icolor beantworten 😃

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

656 Beiträge seit 2008
vor 10 Jahren

Sequence != Identity.

Ich bin jetzt davon ausgegangen, dass icolor weiß was Identities sind. Aber was genau das bezwecken soll, kann uns wohl nur icolor beantworten 😃

Ist klar, aber Identity gibts nicht erst seit gestern; und bisher siehts so aus als ob er einfach nur die nächste ID für irgendwas braucht. Wenn er drauf referenzieren möchte (und/oder ein PK ist), sollte er das ohnehin nur so machen, dass er den PK vergibt, und dann darauf referenziert; nicht umgekehrt. Transaktion, und das übliche andere Gedöns natürlich auch nicht vergessen.

V
162 Beiträge seit 2010
vor 10 Jahren

verwendetes Datenbanksystem: <MS SQL 2010>

Morgen Leute,

ich möchte eine Prozedur erstellen, die mit für eine übergebene Tabelle den Maximalwert für ein Feld (ID) ausliest. Leider komme ich hier an meine Grenzen. Kann mir jemand weiterhelfen?
...

HI,

also es klingt danach das du den nächsten wert haben willst.
Wenn du ein Insert machst kann man einfach erfragen welche neue ID vergeben wurde: SELECT @@IDENTITY
Wenn du selber zählst solltest du dir ein Tabelle machen mit einer Row wo du dann beim Update in einer Transaktion eine Row Sperrung machst.

Bitte schreibe einfach noch genauer was du erreichen willst.

mfg
Björn

Das Leben ist schön!