F# OleDb INSERT INTO 语句从访问中提取数据到链接 SQL Server 时出现语法错误

标签 f# sql-server-2008-r2 oledb ms-access-2010 insert-into

我正在运行 F# 应用程序以将数据从 Access 表提取到链接的 SQL Server 表。这是查询结果:

INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, Zone, Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, DateCreated)
SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], ZONE, SUBZONE, [%CRC], [%CRD], [YR BLT], RENYRS, [%CFD], [%HA], [%MLD], GRP1, [%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, DateCreated
FROM tblPrior

查询在 Access 中解析并运行良好。但在我的应用程序中,它引发了一个错误:INSERT INTO 语句中的语法错误。

这是我的 F#,尽管我认为它不相关。

module Data

open System.Data
open System.Data.OleDb

type Period = Prior | Current

let Upload (p:Period) db =
    use conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + db + ";Persist Security Info=False;")

    let execNonQuery s =
        let comm = new OleDbCommand(s, conn) in
        comm.ExecuteNonQuery() |> ignore

    let (table,proc) = match p with
                       | Prior   -> ("tblPrior"  ,"InitPriorTable")
                       | Current -> ("tblCurrent","InitCurrentTable")

    do conn.Open()

    let u = sprintf "INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, Zone, Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, DateCreated) SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], ZONE, SUBZONE, [%%CRC], [%%CRD], [YR BLT], RENYRS, [%%CFD], [%%HA], [%%MLD], GRP1, [%%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, DateCreated FROM %s" table
    // DEBUG.
    printfn "%s" u
    // DEBUG.
    execNonQuery u
    execNonQuery proc

最佳答案

ZoneDateCreated 均为 reserved words 。很难预测保留字何时会给 SQL 语句带来麻烦,但在我看来,OleDb 可能不太宽容,即更有可能因保留字而失败。查看将所有出现的这些名称括起来是否能让 INSERT 成功。

let u = sprintf "INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, [Zone], Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, [DateCreated]) SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], [ZONE], SUBZONE, [%%CRC], [%%CRD], [YR BLT], RENYRS, [%%CFD], [%%HA], [%%MLD], GRP1, [%%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, [DateCreated] FROM %s" table

关于F# OleDb INSERT INTO 语句从访问中提取数据到链接 SQL Server 时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15815934/

相关文章:

f# - 您将如何在 F# 中实现 Beta 缩减功能?

f# - 模式匹配,F# 与 Erlang

SQL - 对行进行分类

c# - 简化 OleDbDataReader 代码

c# - 如何在 .Net 中使用 OleDB 以我想要的格式从 CSV 导入值?

c# - 来自 Connection 的希伯来语

F# 异步 web 请求,处理异常

F#:如何打印自定义类?

sql-server - 内联表值 UDF 性能

sql-server - 如何从 CTE 获取不同的依赖项列表