Mysql 将数据输入到数据和表名为动态的表中的存储过程

Mysql 将数据输入到数据和表名为动态的表中的存储过程,mysql,stored-procedures,Mysql,Stored Procedures,我一直在使用下面的代码,但我找不到哪里出了问题。我一直在运行下面的代码,它在sql语法中表示错误。请帮助我,我是mysql和存储过程的新手。 我得到的错误是:错误代码1064,您有sql语法错误 CREATE DEFINER=`PotatoHead`@`%` PROCEDURE `InsertIntoTable`(in tablename varchar(45),in ID varchar(45),in Project

我一直在使用下面的代码,但我找不到哪里出了问题。我一直在运行下面的代码,它在sql语法中表示错误。请帮助我,我是mysql和存储过程的新手。 我得到的错误是:错误代码1064,您有sql语法错误

         CREATE DEFINER=`PotatoHead`@`%` PROCEDURE `InsertIntoTable`(in    
            tablename varchar(45),in ID varchar(45),in Project 
            varchar(45),in Variant varchar(45)
            in ReleaseVersion varchar(45) ,
            in TestBenchID varchar(45) ,
            in TestCaseID int(11) ,
            in TestCaseNamespace varchar(100) ,
            in TestCaseName varchar(45),
            in TestCaseDomain varchar(45) ,
            in TestType varchar(45) ,
            in HardwareVersion varchar(4000) ,
            in SoftwareVersion varchar(4000),
            in Result varchar(45) ,
            in Comment varchar(4000),
            in Duration varchar(45) ,
            in StartTime varchar(45) ,
            in EndTime varchar(45)  )
  BEGIN

  SET @sql = CONCAT('Insert into ', tablename ,' (ID,Project,Variant,
            ReleaseVersion,
            TestBenchID ,
            TestCaseID ,
            TestCaseNamespace ,
            TestCaseName ,
            TestCaseDomain ,
            TestType ,
            HardwareVersion ,
            SoftwareVersion ,
            Result ,
            Comment ,
            Duration ,
            StartTime ,
            EndTime) VALUES (');
    SET @sql = CONCAT(ID,',',Project,',',Variant,',',
    ReleaseVersion,',',
    TestBenchID,',',
    TestCaseID,',',
    TestCaseNamespace ,',',
    TestCaseName ,',',
    TestCaseDomain ,',',
    TestType ,',',
    HardwareVersion ,',',
    SoftwareVersion ,',',
    Result ,',',
    Comment ,',',
    Duration ,',',
    StartTime ,',',
    EndTime,');');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;



 END

您有一个小的输入错误,在输入参数列表中缺少一个逗号

in Variant varchar(45)
                      ^^^^
这是我在Workbench中运行代码时收到的完整错误消息

错误代码:1064。您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 要在ReleaseVersion varchar45中使用near'的语法 第6行的TestBenchID varchar45

您编辑了错误消息的一部分,该部分将告诉您在哪里查找引用代码之前的错误

此外,如果您还没有这样做,则需要在多语句过程定义之前和之后重置分隔符,以便MySQL知道如何将整个定义视为一个

e、 g

更新

最后一个更改应该已经编译好了,所以现在我们将讨论运行时错误。我承认,我没有超出您原始代码的第一个错误,因此没有注意到其他一些问题。e、 g

对@sql变量的多次赋值,而不是串联 由concat生成的值列表中的无引号字符串 重复使用参数的列名在这里可以避免,但可能会导致意外的结果 然而,我错过的一件大事是,为什么您甚至想首先使用动态SQL来解决这个问题,除非表名要更改,否则这是不必要的。 让我们把它们按顺序排列:

将INSERT语句的第一部分分配给@sql。那很好。稍后,将值列表指定给同一变量。此时,将替换原始零件,而不是连接两个零件。这导致了您发布的第二个错误。你会用它来修好的

SET @sql = CONCAT(@sql,' VALUES(' etc.
CONCAT语句将为您留下一个字符串,其中包含VARCHAR列的16个不带引号的变量。您需要在所有这些值周围包含单引号,否则PREPARE语句将失败。你会用这个来修的

SET @sql = CONCAT(@sql, '\'',
    ID,'\',\'',
    Project,'\',\'',
    Variant,'\',\'',
    ReleaseVersion,'\',\'',
    TestBenchID,'\',\'',
    TestCaseID,',',
    TestCaseNamespace ,'\',\'',
等等

海螺现在有点乱了,我想你会同意的

接下来是参数和表中的列名使用相同名称的问题。正如我前面提到的,在本例中,您可以不受影响,但是MySQL在确定使用哪个时会优先考虑参数名而不是列名,这可能会导致在SELECT、WHERE子句等中使用参数时出现问题。最好将两者区分开来,以避免混淆。所以,我还要重命名所有的参数。e、 g

 CREATE PROCEDURE `InsertIntoTable` (
    in _tablename varchar(45),
    in _ID varchar(45),
    in _Project varchar(45),
    in _Variant varchar(45),
    in _ReleaseVersion varchar(45) ,
然后相应地更新值列表。顺便说一句,由于您所有的输入参数都在参数中,这是默认值,因此您可以在每个参数之前省去“IN”,并保存一些输入

最后,介绍动态SQL的使用。我怀疑这个过程正在写入表的所有列,并且只有一个表具有这个精确的定义。如果表名不会更改,为什么需要能够在运行时更改它?如果不是这样,那么您为什么要使用多个表来存储完全相同的数据?如果我的怀疑是正确的,那么您可以完全放弃使用动态SQL,这样过程就会变得简单得多

e、 g


这更易于阅读和维护,并且不需要麻烦的字符串操作就可以完成这项工作。MySQL将负责为您引用参数,因为它现在是一个单独的语句,所以不需要开始。。。结束块并重置分隔符。

它仍然不起作用,显示错误代码1064,第1行语法“ID,Project,Version”附近有错误
 CREATE PROCEDURE `InsertIntoTable` (
    in _tablename varchar(45),
    in _ID varchar(45),
    in _Project varchar(45),
    in _Variant varchar(45),
    in _ReleaseVersion varchar(45) ,
CREATE PROCEDURE `InsertIntoYrTablename` (
    _ID varchar(45),
    _Project varchar(45),
    _Variant varchar(45),
    _ReleaseVersion varchar(45),
    _TestBenchID varchar(45),
    _TestCaseID int(11),
    _TestCaseNamespace varchar(100),
    _TestCaseName varchar(45),
    _TestCaseDomain varchar(45),
    _TestType varchar(45),
    _HardwareVersion varchar(4000),
    _SoftwareVersion varchar(4000),
    _Result varchar(45),
    _Comment varchar(4000),
    _Duration varchar(45),
    _StartTime varchar(45),
    _EndTime varchar(45))
  INSERT into `yrtablename` (
    ID,
    Project,
    Variant,
    ReleaseVersion,
    TestBenchID,
    TestCaseID,
    TestCaseNamespace,
    TestCaseName,
    TestCaseDomain,
    TestType,
    HardwareVersion,
    SoftwareVersion,
    Result,
    Comment,
    Duration,
    StartTime,
    EndTime
  ) VALUES (
    _ID,
    _Project,
    _Variant,
    _ReleaseVersion,
    _TestBenchID,
    _TestCaseID,
    _TestCaseNamespace,
    _TestCaseName,
    _TestCaseDomain,
    _TestType,
    _HardwareVersion,
    _SoftwareVersion,
    _Result,
    _Comment,
    _Duration,
    _StartTime,
    _EndTime);