Вставить в выбранную хранимую процедуру не работает вставка NULL

Мой первый раз, когда я создаю хранимую процедуру, пожалуйста, будьте осторожны со мной. Я пытался SELECT мои данные из таблицы 1 (EmpTBL), затем INSERT это в таблицу 2 (EventTBL)

Я думаю, что виновник этой строки прямо здесь:

@Ename varchar(250) = NULL, 
@Edate varchar(250) = NULL,

Я думаю, что моя логика в правильном направлении, я просто не понимаю, почему это не работает.

Не уверенны что делать дальше.

ALTER PROCEDURE spBdayEmp
   (@Ename varchar(250) = NUll,
    @Edate varchar(250)= NUll,
    @Etype varchar(250)  = 'Bday')
AS 
    INSERT INTO EventTBL(EventName, EventDate, EventType)
    VALUES (@Ename, @Edate, @Etype)

    SELECT
        @Ename =  (Ename + ' ' + Lname),    
        @Edate =  DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth) 
    FROM 
        EmpTBL   
    WHERE  
        DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DateOfBirth), DateOfBirth) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30); 

как бы я получить значения для? @ Имя, @ Дата?

я хотел бы, чтобы результат запроса SELECT "Ename + ' ' + Lname" равнялся "@Ename" и " DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth)" равно "@Edate"?

4 ответа

Решение

После прочтения инструкция INSERT не может содержать инструкцию SELECT -sql server2012

Я понял, что все неправильно, поэтому после некоторых экспериментов я наконец нашел решение.

ALTER PROCEDURE spBdayEmp
AS INSERT INTO 
EventTBL SELECT  (Ename + ' ' + Lname), DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth),('Bday')FROM 
EmpTBL WHERE DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DateOfBirth), DateOfBirth) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30);

Спасибо всем, кто пытается помочь!

Вы делаете вставку, прежде чем вы выбрали значения в ваших переменных.

И еще одно соображение - как ваш код будет обрабатывать возврат 2 или более результатов из вашего выбора?

Вы можете быть лучше, используя шаблон, как;

Insert into table2 select values from table1

Попробуйте это так -

ALTER PROCEDURE spBdayEmp
       (@Etype varchar(250)  = 'Bday')
    AS 
        INSERT INTO EventTBL(EventName, EventDate, EventType)
        SELECT
            Ename + ' ' + Lname,    
            DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth),
            @Etype 
        FROM 
            EmpTBL   
        WHERE  
            DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DateOfBirth), DateOfBirth) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30);

Примечание: я вижу, вы использовали @Etype параметр для SP и назначенные ему значения по умолчанию. При выполнении SP Вы не можете пройти @Etypeесли вы хотите, чтобы по умолчанию привыкнуть.

Я надеюсь, у вас есть только 3 столбца в таблице EventTBL. пожалуйста, обновите ваш запрос, как показано ниже:

пожалуйста, измените ваш запрос, как показано ниже, а затем попробуйте

ALTER PROCEDURE spBdayEmp
AS 
INSERT INTO EventTBL(EventName, EventDate, EventType)
SELECT
    @Ename =  (Ename + ' ' + Lname),    
    @Edate =  DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth) ,'Bday'
FROM 
    EmpTBL   
WHERE  
    DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DateOfBirth), DateOfBirth) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30);
Другие вопросы по тегам