插入选择存储过程不起作用插入NULL

Posted

技术标签:

【中文标题】插入选择存储过程不起作用插入NULL【英文标题】:Insert Into Select stored procedure not working inserting NULL 【发布时间】:2015-10-29 08:51:37 【问题描述】:

我第一次在这里创建存储过程,请放轻松。我试图 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); 

我将如何获得值? @Ename,@Edate?

我希望 SELECT 查询“Ename + ' ' + Lname”的结果等于“@Ename”和“ DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth ), 等于“@Edate”?

【问题讨论】:

这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。 还有:你如何调用这个存储过程?您将哪些传递给参数? 我只是先在 sql server management studio 中对其进行测试,看看它是否有效,然后在我的 asp.net VB 项目中调用它 【参考方案1】:

在为变量选择值之前进行插入。

还有一个考虑因素 - 您的代码将如何处理从您的选择返回 2 个或更多结果?

使用类似的模式可能会更好;

Insert into table2 select values from table1

【讨论】:

【参考方案2】:

我希望您在 EventTBL 表中只有 3 列。请更新您的查询如下:

请更改您的查询如下,然后尝试

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);

【讨论】:

我收到此错误先生。 singh "必须声明标量变量 "@Ename"。"【参考方案3】:

试试这样 -

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);

注意:我看到你已经为 SP 使用了@Etype 参数并为其分配了一些默认值。执行 SP 时,如果要使用默认值,则不能传递 @Etype

【讨论】:

我故意将@Etype 值设置为“Bday”作为默认值 我将如何获得值? @Ename,@Edate?我希望这个“Ename + '' + Lname”的结果等于“@Ename”和“DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth)”等于“@Edate”? 要获取值,您可以在SELECT 语句中使用以下 - @Ename = (Ename + ' ' + Lname) @Edate = DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,dateOfBirth), dateOfBirth) 但请记住将这些值用于INSERT,您需要在SELECT 之后使用INSERT完成了。【参考方案4】:

看完INSERT statement cannot contain a SELECT statement -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);

感谢所有试图提供帮助的人!

【讨论】:

以上是关于插入选择存储过程不起作用插入NULL的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程执行时,executeUpdate() 不起作用

插入带有参数MYSQL的存储过程不起作用

将存储过程数据插入临时表不起作用

从后面的 C# 代码调用存储过程时插入语句不起作用

sql插入过程不起作用

实体框架 4 函数导入不起作用