Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StoredProc (https://www.delphipraxis.net/51281-storedproc.html)

Peeters 9. Aug 2005 18:47

Datenbank: MS-SQL • Version: 2000 • Zugriff über: ADO

StoredProc
 
Hallo,
habe eine Frage zum Verständnis, habe diesen String in einer Gespeicherten Prozedure auf dem Server:
Delphi-Quellcode:
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL
AS
SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr

IF @FormNr = ''
BEGIN
SELECT * FROM MPK_DEKOR
END
ELSE
BEGIN
SELECT * FROM MPK_SAMMEL
END
GO
möchte aus der Ergebnissmänge der SELECT-Anweisung eine IF-Abfrage machen die mir sagt, ob der Wert (@FormNr) auch wirklich in der Ergebnissmänge liegt! Da ich die SELECT-Anweisung nicht direkt vergleichen kann, habe ich erst einmal
Delphi-Quellcode:
 @FormNr = ''
dafür stehen.

Ist der Ansatz richtig oder liege ich völlig falsch?

marabu 10. Aug 2005 07:57

Re: StoredProc
 
Hallo,

kannst du dein Problem etwas genauer beschreiben? Dein SP-Code macht für mich keinen Sinn.

Grüße vom marabu

Marcel Gascoyne 10. Aug 2005 09:23

Re: StoredProc
 
Vielleicht meinst Du das:

SQL-Code:
if exists(select <feldname> from <tabelle> where <feldname> = @FormNr)
begin
...
end
Gruß,
Marcel

jensw_2000 10. Aug 2005 09:27

Re: StoredProc
 
So funktioniert es ...
Du musst prüfen ob die initiale Abfrage "SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr" Datensätze zurückgibt ...

SQL-Code:
CREATE PROCEDURE SP_IMPORT_FORM
  @FormNr VARCHAR(5) = NULL
AS
-- versuche @FormNr in MPK_FORM zu finden
SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr

-- wenn @@ROWCOUNT = 0 (also kein Datensatz zurückgegeben)
IF @@ROWCOUNT = 0
BEGIN
  -- Gib alle Spalten und alle Datensätze der Tabelle MPK_DEKOR zurück
  SELECT * FROM MPK_DEKOR
END
ELSE
BEGIN
  -- Gib alle Spalten und alle Datensätze der Tabelle MPK_SAMMEL zurück
  SELECT * FROM MPK_SAMMEL
END
GO
Die Variante von Marcel funktioniert auch, jedoch machst du dann einen zusätzlichen (unnötigen) Funktionsaufruf (EXISTS), den wir mit meiner Methode vermeiden können.
@@ROWCOUNT wird standardmäßig bei jedem INSERT, UPDATE, SELECT, DELETE zurückgegeben.

Peeters 10. Aug 2005 12:38

Re: StoredProc
 
@Marcel: Wunderbar, dass ist genau was ich gesucht habe. Vielen Dank.

@jensw_2000: Bei deiner Variante bekomme ich nur die Ergebnismenge der SELECT-Abfrage raus, und nicht die in der IF-Abfrage sind.

Peeters 11. Aug 2005 11:06

Re: StoredProc
 
Habe jetzt ein neues Problem, wenn ich diese Prozedur

Delphi-Quellcode:
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL,
@FormBez VARCHAR(30) = NULL
AS
IF NOT EXISTS (SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr)
BEGIN
  INSERT INTO MPK_FORM (FORMNR, BEZ_DEU) VALUES (@FormNr, @FormBez)
END
GO
ausführe, bekomme ich eine Fehlermeldung die lautet: "ADOStoredProc: CommandText gibt keine Ergebnismenge zurück".

Was heißt das?

shmia 11. Aug 2005 13:57

Re: StoredProc
 
Zitat:

Zitat von Peeters
Delphi-Quellcode:
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL,
@FormBez VARCHAR(30) = NULL
AS
IF NOT EXISTS (SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr)
BEGIN
  INSERT INTO MPK_FORM (FORMNR, BEZ_DEU) VALUES (@FormNr, @FormBez)
END
GO
ausführe, bekomme ich eine Fehlermeldung die lautet: "ADOStoredProc: CommandText gibt keine Ergebnismenge zurück".

Du musst anstelle von ADOStoredProc.Open oder .Active := True die Procedure ADOStoredProc.ExecProc aufrufen!

Marcel Gascoyne 11. Aug 2005 14:17

Re: StoredProc
 
Zitat:

Zitat von Peeters
Habe jetzt ein neues Problem, wenn ich diese Prozedur
ausführe, bekomme ich eine Fehlermeldung die lautet: "ADOStoredProc: CommandText gibt keine Ergebnismenge zurück".

Deine Procedure liefert auch keine Ergebnismenge, also entweder mit ExecSQL ausführen oder die Anzahl der Datensätze in der Procedure zurückliefern:


SQL-Code:
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL,
@FormBez VARCHAR(30) = NULL
AS
BEGIN
  IF NOT EXISTS (SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr)
  BEGIN
    INSERT INTO MPK_FORM (FORMNR, BEZ_DEU) VALUES (@FormNr, @FormBez)
    SELECT ROWS = @@ROWCOUNT
  END
  ELSE
    SELECT ROWS = 0
END
GO

Gruß,
Marcel


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz