cs_elpens
Messages postés260Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention 3 novembre 2007
-
12 juin 2006 à 16:18
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 2013
-
13 juin 2006 à 12:50
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...
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 20134 13 juin 2006 à 12:47
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.
cs_elpens
Messages postés260Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention 3 novembre 2007 13 juin 2006 à 08:06
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
-------------------------------------------------------------------------------------------------------------------------