Insert Into选择存储过程不工作插入NULL

时间:2015-10-29 08:51:37

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

我第一次在这里创建存储过程,请放轻松。我试图从表1(SELECTEmpTBL我的数据,然后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“?

4 个答案:

答案 0 :(得分:0)

在为变量选择值之前,先执行插入操作。

另外考虑一下 - 您的代码将如何处理从您的选择中返回2个或更多结果?

你最好使用像;

这样的模式
Insert into table2 select values from table1

答案 1 :(得分:0)

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

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

var defferd = $q.defer();

         var db = openConn('test1','1.0.0' , 'test1' , 200000);
         db.transaction(insertUserInformation, errorDB, successDB);

         function insertUserInformation(tx) {
            tx.executeSql('CREATE TABLE IF NOT EXISTS USERINFO (ID UNIQUE, USERNAME , FULLNAME , PROFILEPIC , ACCESS_TOKEN)');
         }

    function openConn(databaseName, dbVersion, dbShowName, dbSize){
        return window.openDatabase(databaseName, dbVersion, dbShowName, dbSize);
     }

    function errorDB(tx, err) {
        defferd.reject(err);
    }

    function successDB() {
        defferd.resolve(result)
    }

return defferd.promise;

答案 2 :(得分:0)

试试这样 -

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 :(得分:0)

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

感谢所有帮助过的人!