2010-08-13 5 views
1

J'essaie de créer une procédure stockée simple que je peux utiliser pour écrire des données dans une table de journal. Je suis un noob dans les procédures stockées, alors qu'est-ce qui me manque ici? Je reçois une erreur en disant:SQL Server: aide avec une procédure stockée simple?

Msg 201, Level 16, State 4, Procedure toLog, Line 0 
Procedure or function 'toLog' expects parameter '@messageTime', which was not supplied. 

Comment modifier ce code pour obtenir ce travail?

USE <database> 
GO 
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME = 'logTable') 
    DROP TABLE dbo.logTable 
GO 
CREATE TABLE dbo.logTable (
    messageTime DATETIME NULL, 
    etlJobName NVARCHAR(40) NULL, 
    whereTo VARCHAR(10) NOT NULL, 
    messag VARCHAR(255) NULL 
) 

/*************** procedure ************/ 
--DROP PROC dbo.toLog 

CREATE PROCEDURE dbo.toLog 
    @messageTime DATETIME, 
    @etlJobName NVARCHAR(60) = 'unknown', 
    @whereTo NVARCHAR(20) = 'print', 
    @messag NVARCHAR(255) = 'empty' 
AS 
BEGIN 
SET @messageTime = GETDATE() 
IF @whereTo = 'log' OR @whereTo = 'logandprint' 
    INSERT INTO logTable(messageTime, etlJobName, whereTo, messag) 
    VALUES (@messageTime, @etlJobName, @whereTo, @messag) 
IF @whereTo = 'print' OR @whereTo = 'logandprint' 
    PRINT CONVERT(VARCHAR, GETDATE(), 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag 
END 
GO 

--execution 
EXEC dbo.toLog @whereTo = 'log' 
+0

Le message d'erreur est clair. @messageTime est le paramètre requis pour votre procédure, devrait être EXEC dbo.toLog @messageTime = getdate(), @messag = 'c'est un test' –

Répondre

1

C'est parce que votre sproc de toLog vous attend à fournir le paramètre @messageTime, que vous ne l'avez pas fait, et il ne dispose pas d'une valeur par défaut comme les autres paramètres.

Comme vous définissez le @messageTime toujours GETDATE() à l'intérieur du sproc, il vous ressemble voulez juste supprimer ce paramètre:

CREATE PROCEDURE dbo.toLog 
    @etlJobName NVARCHAR(60) = 'unknown', 
    @whereTo NVARCHAR(20) = 'print', 
    @messag NVARCHAR(255) = 'empty' 
AS 
BEGIN 
IF @whereTo = 'log' OR @whereTo = 'logandprint' 
    INSERT INTO logTable(messageTime, etlJobName, whereTo, messag) 
    VALUES (GETDATE(), @etlJobName, @whereTo, @messag) 
IF @whereTo = 'print' OR @whereTo = 'logandprint' 
    PRINT CONVERT(VARCHAR, GETDATE(), 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag 
END 

Ou, si vous voulez être en mesure de passer dans un dateTime vous:

CREATE PROCEDURE dbo.toLog 
     @messageTime DATETIME = null, 
     @etlJobName NVARCHAR(60) = 'unknown', 
     @whereTo NVARCHAR(20) = 'print', 
     @messag NVARCHAR(255) = 'empty' 
    AS 
    BEGIN 
    IF (@messagetime IS NULL) SET @messagetime = GETDATE() 

    IF @whereTo = 'log' OR @whereTo = 'logandprint' 
     INSERT INTO logTable(messageTime, etlJobName, whereTo, messag) 
     VALUES (@messageTime, @etlJobName, @whereTo, @messag) 
    IF @whereTo = 'print' OR @whereTo = 'logandprint' 
     PRINT CONVERT(VARCHAR, @MessageTime, 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag 
    END 
+0

Merci, votre solution de secod produit une erreur: Msg 102, niveau 15, état 1 , Procédure toLog, Ligne 2 Msg 137, Niveau 15, État 2, Procédure toLog, Ligne 8 Doit déclarer la variable scalaire "@whereTo" Msg 137, Niveau 15, État 2, Procédure toLog, ligne 10 Doit déclarer la variable scalaire "@messageTime" Msg 137, niveau 15, état 2, procédure toLog, ligne 11 Doit déclarer la variable scalaire "@whereTo" Msg 137, niveau 15, état 2, Procedure toLog, Line 12 Doit déclarer la variable scalaire "@Message Temps". – atricapilla

+0

@atricapilla - des excuses, corrigées maintenant. Erreur car vous ne pouvez pas spécifier GETDATE() en tant que valeur par défaut pour un paramètre. Donc, à la place, il est maintenant par défaut à la constante: null - qui est ensuite vérifié dans le sproc – AdaTheDev

+0

Merci beaucoup! .... – atricapilla

1

lorsque vous créez la procédure stockée avec des paramètres, à une cause que nous devons transmettre les valeurs de paramètres, lors de l'exécution procédure stockée.

Exemple 1:

EXEC dbo.toLog '','','','' 

Dans la ligne ci-dessus lorsque vous exécutez la procédure stockée, il ne sera pas jeté toute erreur. parce que passé les valeurs des paramètres sont NULL.

Exemple 2:

EXEC dbo.toLog '','','log','' 

Dans la ligne ci-dessus lorsque vous exécutez la procédure stockée, il ne sera pas jeté toutes les erreurs, les données seront enregistrées dans votre table. Basé sur la procédure stockée dans la logique de script

Questions connexes