Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL插入到存在列的位置_Sql_Csv_If Statement_Insert_Exists - Fatal编程技术网

SQL插入到存在列的位置

SQL插入到存在列的位置,sql,csv,if-statement,insert,exists,Sql,Csv,If Statement,Insert,Exists,我在使用SQL insert语句时遇到问题 当前,Insert语句用于将数据从.CSV文件传输到SQL表中,但.CSV文件的内容可能会有所不同,即它可能包含与上一个文件不同的列 我用来从.CSV文件中获取数据的语句支持不同的列,因为它创建了一个与.CSV显示完全相同的临时表 我当前使用的Insert语句是: INSERT INTO RTCU(ItemDATE, ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr

我在使用SQL insert语句时遇到问题

当前,Insert语句用于将数据从.CSV文件传输到SQL表中,但.CSV文件的内容可能会有所不同,即它可能包含与上一个文件不同的列

我用来从.CSV文件中获取数据的语句支持不同的列,因为它创建了一个与.CSV显示完全相同的临时表

我当前使用的Insert语句是:

INSERT INTO RTCU(ItemDATE, ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr
                 ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3
                 ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev
                 ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5
                 ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO)      
SELECT CONVERT(DATETIME,ItemDATE,103), ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr
                 ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3
                 ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev
                 ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5
                 ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO
FROM tmpDATA
但正如您所看到的,我复制的列是固定的,那么如果我的.CSV文件中有一个列“HeatMeter”,我将如何将该列复制到RTCU表中呢

提前谢谢!!
尼尔

我不能百分之百肯定我理解你的需求,但这是我最好的猜测

您有一个目标表

 ID | val_1 | val_2 | val_3
您有一个源表

 ID | val_1 | val_3
 ID | val_2 | val_3
还有第二个源表

 ID | val_1 | val_3
 ID | val_2 | val_3
您想将来自两个不同来源的数据插入目标表

一个选项是在不同的列上指定默认值

CREATE TABLE destination (
  id      INT,
  val_1   INT DEFAULT(-1),
  val_2   INT DEFAULT(-2),
  val_3   INT DEFAULT(-3)
)

-- val3 is not specified in this insert
-- This means that it will appear as -3 for all the inserted rows
------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2)
SELECT id, val_1, val_2 FROM source1

-- val1 is not specified in this insert
-- This means that it will appear as -1 for all the inserted rows
------------------------------------------------------------------
INSERT INTO destination (id, val_2, val_3)
SELECT id, val_2, val_3 FROM source2
另一个选择是简单地硬编码您希望在“缺失”字段中显示的值

-- source1 does not have a val_3 field, so we hard-code the insert
-- to always put NULL in that field.
-------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2, val3)
SELECT id, val_1, val_2, NULL  FROM source1

-- source2 does not have a val_1 field, so we hard-code the insert
-- to always put 0 in that field.
-------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2, val_3)
SELECT id, 0,  val_2, val_3 FROM source2

任何值都可以用作默认值或硬编码值。

如果目标表中没有该字段,则无法将该字段插入表中。要将数据插入字段,该字段必须存在。那么,您是在问如何将字段添加到现有表中吗?或者您正在询问如何将
表1.fieldX
插入
表2.fieldY
?目前的问题是
如何将这个方钉装入这个圆孔?
但我认为我们需要更清楚地了解您的需求,以了解什么方法可以真正帮助您。目标表将有列,但源表可能有列,也可能没有列。例如,源A可能有“Pwr,RPM,Volts,Freq,Mode”列,其中源B可能有“Pwr,RPM,Volts,Freq,Mode”,结果A+B将有“Pwr,RPM,Volts,Freq,Mode,CCpres,OilLev”,那么我如何确保源A和B的不同内容复制到结果中呢,我认为这不会起作用,因为源表总是使用相同的名称tmpDATA。此tmpDATA表是根据CSV文件中包含的内容动态创建的。因此,对于CSV中存在的每一列,都会在tmpDATA表中创建该列。在我的问题中,所有CSV都会有一些公共列,它们永远不会像上面那样改变,但也会有变量列,它们可能存在于tmpDATA表中,也可能不存在于tmpDATA表中。例如:插入RTCU(ItemDATE、ItemTIME、Variable1)选择CONVERT(DATETIME、ItemDATE、103)、ItemTIME(如果存在(Variable1))FROMtmpDATA@NeilRutherford-这就是为什么在上述示例中有两个不同的insert语句。当插入到目标表中时,代码必须指定值的位置。如果源架构每次都不同,则insert语句每次都必须不同。你有三个基本的选择:1。强制执行确保CSV中存在所有字段的规则(即使该值为空)。2.每次收到文件时手动编写不同的insert语句。3.编写代码(使用sql或其他语言)为您编写新的sql Insert语句(称为动态sql)。