Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Select Maxwert from @Table
icolor
myCSharp.de - Member



Dabei seit:
Beiträge: 116
Herkunft: aus dem Ei

Themenstarter:

Select Maxwert from @Table

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
icolor
myCSharp.de - Member



Dabei seit:
Beiträge: 116
Herkunft: aus dem Ei

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von icolor am .
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

sorry mein fehler hab die Augen noch nicht richtig auf.. (Urlaub ;) vergiss was ich gesagt habe.. war im falschen Film
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 656

beantworten | zitieren | melden

Versuchs mal mit SET NOCOUNT ON.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2137

beantworten | zitieren | melden

Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am .
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 656

beantworten | zitieren | melden

Zitat von Khalid
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BhaaL am .
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

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 :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Khalid am .
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 656

beantworten | zitieren | melden

Zitat von Khalid
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.
private Nachricht | Beiträge des Benutzers
Viper78
myCSharp.de - Member



Dabei seit:
Beiträge: 163
Herkunft: Dortmund

beantworten | zitieren | melden

Zitat von icolor
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!
private Nachricht | Beiträge des Benutzers