begin process at 2008 08 29 12:19:23
1 233 607 membres
144 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème de function [ SQL Server, MSDE, SQL Express / Functions ] (elpens)

Problème de function le 12/06/2006 16:18:46

elpens
Bonjour,

J'ai un petit soucis avec une fonction qui devrait retourner un tableau :

Create FUNCTION ...
RETURNS Table
AS
...
...

return (SELECT [Order], Command, Argument, Condition, NextStep_Yes, NextStep_No FROM [Sequence] WHERE idSequence BETWEEN @idSequence AND (SELECT MIN(idSequence) FROM [Sequence] WHERE idSequence > @idSequence AND Command = 1) - 1)

Error 170 : Incorrect Syntax near 'BEGIN' à la dernière ligne...

Si quelqu'un à une idée...

Merci et bonne journee

 ElpenS

Re : Problème de function le 12/06/2006 17:56:41

Malkuth
Membre Club
Salut,
Peut tu envoyer l'ensemble de la function?

Re : Problème de function le 13/06/2006 08:06:57

elpens

Voilà...

-------------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [db].[SlctPrc] (@server nvarchar(255), @alert nvarchar(255))
RETURNS TABLE AS 
BEGIN
   -- Variable declaration --
   DECLARE @idGeneral integer
   DECLARE @countGeneral integer
   DECLARE @idServer integer
   DECLARE @idSequence  integer

   SET @countGeneral = (SELECT COUNT(*) FROM GeneralProcedure)
   SET @idGeneral = 1
   SET @idSequence  = 0
   SET @idServer = (SELECT idServer FROM Server WHERE Name = @server)

   -- Check if it is a general alert -- 
   WHILE @idGeneral <= @countGeneral
      BEGIN
         if @alert = (SELECT alertIdentifier FROM GeneralProcedure WHERE idGeneralProc = @idGeneral)
            BEGIN
               SET @idSequence = (SELECT fk_idSequence FROM GeneralProcedure WHERE idGeneralProc = @idGeneral)
            END
            SET @idGeneral = @idGeneral + 1
      END

   -- If no general alert was found
   if @idSequence = 0
      BEGIN
         -- Check if a Procedure exist for this server with this alert --
         SET @idSequence  = (SELECT fk_idSequence FROM [Procedure] WHERE AlertIdentifier LIKE @alert AND fk_server = @idServer)
         if @idSequence  IS NULL
            BEGIN
               -- Check if a Procedure exist for this server --
               SET @idSequence = (SELECT fk_idSequence FROM [Procedure] WHERE  fk_server = @idServer)
         END
      END

   return (SELECT [Order], Command, Argument, Condition, NextStep_Yes, NextStep_No FROM [Sequence] WHERE idSequence BETWEEN @idSequence AND (SELECT MIN(idSequence) FROM [Sequence] WHERE idSequence > @idSequence AND Command = 1) - 1)

END
-------------------------------------------------------------------------------------------------------------------------

Merci d'avance,

 ElpenS


Re : Problème de function le 13/06/2006 12:47:32

Malkuth
Membre Club
Réponse acceptée !

Essaie cette fonction là :







CREATE FUNCTION [db].[SlctPrc] (
   @server nvarchar(255), 
   @alert nvarchar(255))
RETURNS @TmpTable TABLE (
   [ID] [bigint] NOT NULL,
   [Chp1] [bigint] NOT NULL,
   [Chp2] [money] NOT NULL,
   [Chp3] [Datetime] NOT NULL
)
AS 
BEGIN 
 
-- Check if it is a general alert -- 
SET @idSequence =ISNULL( (SELECT MIN(fk_idSequence) FROM GeneralProcedure WHERE alertIdentifier=@alert),0)

-- Check if a Procedure exist for this server with this alert --
if @idSequence = 0
   SET @idSequence  = ISNULL((SELECT MIN(fk_idSequence) FROM [Procedure] WHERE AlertIdentifier LIKE @alert AND fk_server = @idServer),0)

-- Check if a Procedure exist for this server --
if @idSequence = 0
   SET @idSequence = ISNULL((SELECT MIN(fk_idSequence) FROM [Procedure] WHERE  fk_server = @idServer),0)

--Result Table

INSERT INTO @TmpTable
   ([Order],
   Command, 
   Argument, 
   Condition, 
   NextStep_Yes, 
   NextStep_No )
SELECT 
   [Order], 
   Command, 
   Argument, 
   Condition, 
   NextStep_Yes, 
   NextStep_No
FROM 
   [Sequence]
WHERE 
   idSequence 
   BETWEEN 
      @idSequence 
   AND 
      ((SELECT MIN(idSequence) FROM [Sequence] WHERE idSequence > @idSequence AND Command = 1) - 1)

RETURN
END

Pour infos : on ne parcour pas une table dans un while avec une requette SELECT
D'abord parce que ton index peut avoir des trous(Enregistrement supprimer) ensuite parce que a chaque boucle on refai une nouvelle requette. Pour cela il exist les curseurs dont tu veras un example dans les tutorials du site.

Ensuite tu a du voir que j'avais construit ma déclaration diféremment de la tienne
RETURNS @TmpTable TABLE (
   [Order] [bigint] NOT NULL, 
   Command [bigint] NOT NULL, 
   Argument [bigint] NOT NULL, 
   Condition [bigint] NOT NULL, 
   NextStep_Yes [bigint] NOT NULL, 
   NextStep_No [bigint] NOT NULL 
)
permet  a la fois de définir les champs de la table retourner mais créer aussi une variable de retour : @TmpTable.dans laquelle insère les résultats à la fin.


Re : Problème de function le 13/06/2006 12:50:03

Malkuth
Membre Club
J'ai oublier :

DECLARE @idSequence  integer
DECLARE @idServer integer
SET @idServer = (SELECT idServer FROM Server WHERE Name = @server)

Juste au début du corp de la procedure.


Classé sous : problème, function, select, command, idsequence

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS