begin process at 2012 05 27 00:01:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

SQL Server, MSDE, SQL Express

 > 

Functions

 > 

Problème de function


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de function

lundi 12 juin 2006 à 16:18:46 | Problème de function

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
lundi 12 juin 2006 à 17:56:41 | Re : Problème de function

Malkuth

Membre Club
Salut,
Peut tu envoyer l'ensemble de la function?
mardi 13 juin 2006 à 08:06:57 | Re : Problème de function

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

mardi 13 juin 2006 à 12:47:32 | Re : Problème de function

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.

mardi 13 juin 2006 à 12:50:03 | Re : Problème de function

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.


Cette discussion est classée dans : problème, function, select, command, idsequence


Répondre à ce message

Sujets en rapport avec ce message

Problème pour passer un paramètre dans une requete [ par franckydeluka ] Bonjour à tous ,Voilà j'ai un petit souci SQL si quelqu'un a déjà rencontré le problèmeJe fais la requete suivante qui marche très bien (je récupère l problème concaténation [ par chamallow ] Bonjour,J'ai un petit problème avec une concaténation. C'est tout bête mais bon.SELECT CAST("1/1/" + CAST(annee AS CHAR(4)) AS DATETIME)from maTableSq Commande Select [ par mcligth ] Bonjour tout le monde, je desire tout d' abord effectuer une requête dans un champ d' une table de facon a ce que celà me crée un champ decoulement de Problème requête SQL [ par younes371 ] Bonjour,J'ai fait cette requette, mais ça marche pas !SELECT id, nom,FROM table2WHERE idIN ( SELECT idLFROM table3WHERE idA =  '2' )MySQL a répondu:#1 problème de requette [ par beny100 ] bonjour,j'ai un problème avec ma requette. voiçi le code:select * from Alarme_active where date_debut >='31/01/2007'and date_debut='01/02/2007'elle ne Problème avec DateDiff [ par Chatbour ] Salut à tous,j'ai la requête suivante :SELECT DateDiff("j", #02-06-2007#, #06-04-2004#)FROM matable;l'erreur : "Appel de procédure incorrect"j'ai test Problème avec une SP avec SELECT et WHERE multiple [ par SoyYo ] Salut, comme dit dans le titre, j'ai un problème avec une SP qui et un select: CREATE PROCEDURE `AdminConnect`(nom varchar(255), pass varchar(255)) B Valeur par defaut dans un select [ par SoyYo ] Salut J'ai un problème avec une clé étrangère qui peut être null. En fait c'est pas un problème SQl mais c'est plutôt Visual Studio qui ne me fait pa problème d'opérande dans le résultat de ma chaine sql [ par beegeezzz ] Bonjour tout le monde,J'ai un petit souci avec cette chaine SQL :SELECT NOTEFROM inscrits_enWHERE MATRICULE_ETIN (SELECT DISTINCT MATRICULE_ET, NOM_ET Select d'un champs qui contient plusieurs entré [ par beberto56 ] Bonjour, j'ai un problème avec une requête qui concerne deux tables au sein d'une même base de données. Je vous décris mon problème: Voila la requêt


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,276 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales