Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 使用Excel VBA插入红移_Sql_Excel_Vba_Amazon Redshift - Fatal编程技术网

Sql 使用Excel VBA插入红移

Sql 使用Excel VBA插入红移,sql,excel,vba,amazon-redshift,Sql,Excel,Vba,Amazon Redshift,我需要将数据从excel加载到Redshift。我之所以会出错,是因为有数字列,并且将行的每个单元格中的值转换为数组后会变成字符串。这很好,但数字列需要Null而不是“” 这是代码 Private子命令按钮1\u单击() 将BCS设置为工作表 Set BCS=此工作簿.Sheets(Sheet3.Name) Sheetcolumns=“(fbn、地区、站点、财务经理、阶段类型、故事数量、阶段数量、方案设计类型,”_ “操作、建造、计划、移交、移交前的周数、标准、车辆总数、数量子类别、价值子类别,

我需要将数据从excel加载到Redshift。我之所以会出错,是因为有数字列,并且将行的每个单元格中的值转换为数组后会变成字符串。这很好,但数字列需要Null而不是“”

这是代码

Private子命令按钮1\u单击()
将BCS设置为工作表
Set BCS=此工作簿.Sheets(Sheet3.Name)
Sheetcolumns=“(fbn、地区、站点、财务经理、阶段类型、故事数量、阶段数量、方案设计类型,”_
“操作、建造、计划、移交、移交前的周数、标准、车辆总数、数量子类别、价值子类别,”_
“采购订单数量、采购订单单位成本、采购订单总额、发票数量、发票单位成本、发票总额、发票与采购订单的差异百分比,”_
“手动数量估算、手动单位成本估算、手动调整估算、手动估算总计、估算选择、最终估算数量、最终单位成本估算,”_
“最终调整预计、最终预计总计、预测减少选择、预测减少百分比、最终预测”_
采购单、手工、百分比、库存、手工、百分比、备注、快照、日期
Set con=New ADODB.Connection
#如果是Mac那么
'如果是Mac,则使用此驱动程序
CS=“驱动程序={Amazon Redshift};服务器={};UID=;密码=;数据库=;端口=8192”
#艾尔塞夫64那么
CS64=“驱动程序={Amazon红移(x64)};服务器={};UID=;密码=;数据库=awscfpa;端口=8192”
继续打开CS64
#否则
CS32=“驱动程序={Amazon Redshift(x86)};服务器={};UID=;密码=;数据库=awscfpa;端口=8192”
打开CS32
#如果结束
对于BCS.ListObjects(1.DataBodyRange.Rows.Count)的r=2
valuesArray=BCS.Range(“A”&r&“:AJ”&r).Value
insertValues=Join2D(valuesArray,“,”)
Sql=“INSERT INTO dcgs.bcs_output”&Sheetcolumns&value(“&”&insertValues&“&”,当前_日期)”
con.执行Sql
下一个r
结案
设置con=Nothing
端接头
公共函数Join2D(ByVal vArray作为变量,可选ByVal sWordDelim作为String=”“,可选ByVal sLineDelim作为String=vbNewLine)作为字符串
我和我一样长,我和我一样长
Dim aReturn()作为字符串
Dim aLine()作为字符串
重读重读(LBound(vArray,1)到UBound(vArray,1))
雷迪姆线(LBound(vArray,2)至UBound(vArray,2))
对于i=LBound(vArray,1)到UBound(vArray,1)
对于j=LBound(vArray,2)到UBound(vArray,2)
'将当前行放入1d数组中
aLine(j)=vArray(i,j)
下一个j
'将当前行连接到1d数组中
aReturn(i)=加入(aLine、sWordDelim)
接下来我
Join2D=连接(旋转、滑动)
端函数
Join2D是我从之前的一个提问中得到的,但在这种情况下,一切都是一个字符串。是否有一种方法可以修改它以提供一个输出,如果insertValues元素为“”,它会将其更改为Null?我尝试了一个带有if语句的for循环,尝试将任何“”元素更改为Null,但它导致类型不匹配


我也愿意使用其他方法将数据进行红移,如果这是一个更简单的选择,则不需要逐行插入。

考虑行业最佳实践,以避免将数据值连接和标点到SQL语句中的混乱和潜在危险需要。并且还避免将不同的数据类型与数组方法相结合

假设你的Excel数据库API是ADO,考虑参数化的对象。这需要扩展所有36个字段(A-AJ列)的
.CreateParameter()
调用,并显式定义数据类型。空单元格可以转换为插入的
NULL
实体

”准备好的语句(无数据),带有36个参数placedholer
sql=“插入dcgs.bcs_输出(Col1、Col2、Col3、…、Col37)”_
&“值(?,,,,,,,,,,,,,,,,,,,”
& "        ?, ?, ?, ?, ?, ?, ?, ?, ?,                   " _
& "        ?, ?, ?, ?, ?, ?, ?, ?, ?,                   " _
&“,,,,,,,,,,,,,,,,,,,,,当前日期”
对于BCS.ListObjects(1.DataBodyRange.Rows.Count)的r=2
'配置ADO命令
Set cmd=New ADODB.Command
使用cmd
.ActiveConnection=conn
.CommandText=sql
.CommandType=adCmdText
'绑定所有36个参数值
.Parameters.Append.CreateParameter(“param1”、adInt、adParamInput、BCS.Range(“A”&r).Value)
.Parameters.Append.CreateParameter(“param2”、adVarchar、adParamInput、BCS.Range(“B”&r).Value)
' ...
.Parameters.Append.CreateParameter(“param36”、adXXXX、adParamInput、BCS.Range(“AJ”&r).Value)
"执行行动"
.执行
以
Set cmd=Nothing
下一个r

考虑行业最佳实践,以避免将数据值串联和标点到SQL语句中的混乱和潜在危险需求。并且还避免将不同的数据类型与数组方法相结合

假设你的Excel数据库API是ADO,考虑参数化的对象。这需要扩展所有36个字段(A-AJ列)的
.CreateParameter()
调用,并显式定义数据类型。空单元格可以转换为插入的
NULL
实体

”准备好的语句(无数据),带有36个参数placedholer
sql=“插入dcgs.bcs_输出(Col1、Col2、Col3、…、Col37)”_
&“值(?,,,,,,,,,,,,,,,,,,,”
& "        ?, ?, ?, ?, ?, ?, ?, ?, ?,                   " _
& "        ?, ?, ?, ?, ?, ?, ?, ?, ?,                   " _
&“,,,,,,,,,,,,,,,,,,,,,当前日期”
对于BCS.ListObjects(1.DataBodyRange.Rows.Count)的r=2
'配置ADO命令
Set cmd=New ADODB.Command
使用cmd
.ActiveConnection=conn
.CommandText=sql
.CommandType=adCmdText
'绑定所有36个参数值
.Parameters.Append.CreateParameter(“param1”、adInt、adParamInput、,