Вставить в выбранную хранимую процедуру не работает вставка 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);