SQL Server: помочь с простой хранимой процедурой? - PullRequest
1 голос
/ 13 августа 2010

Я пытаюсь создать простую хранимую процедуру, которую я могу использовать для записи данных в таблицу журнала. Я нуб в хранимых процедурах, так чего мне здесь не хватает? Я получаю сообщение об ошибке:

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

Как изменить этот код, чтобы получить эту работу?

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'

Ответы [ 2 ]

1 голос
/ 21 октября 2013

Когда вы создаете хранимую процедуру с параметрами, при любом случае нам нужно передавать значения параметров при выполнении хранимой процедуры.

Пример 1:

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

В приведенной выше строке при выполнении хранимой процедуры она не выдаст никаких ошибок. потому что переданные значения параметров равны NULL.

Пример 2:

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

В приведенной выше строке, когда вы выполняете хранимую процедуру, она не выдаст никаких ошибок, данные будут зарегистрированы в вашей таблице. На основе хранимой процедуры внутри логики скрипта

1 голос
/ 13 августа 2010

Это потому, что ваш toLog sproc ожидает, что вы предоставите параметр @messageTime, чего вы еще не сделали, и у него нет значения по умолчанию, как у других параметров.

Поскольку вы всегда устанавливаете для @messageTime значение GETDATE () внутри sproc, похоже, что вы просто хотите удалить этот параметр:

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

Или, если вы хотите иметь возможность самостоятельно передавать дату:

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
...