【问题标题】:Insert Into Select stored procedure not working inserting NULL插入选择存储过程不起作用插入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 项目中调用它

标签: sql sql-server stored-procedures insert-into select-into


【解决方案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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2020-07-15
      • 1970-01-01
      • 2023-03-13
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多