【问题标题】:"An Object or Column Name is missing" when trying to run a dynamically generated update query from VBA to SQL Server尝试从 VBA 到 SQL Server 运行动态生成的更新查询时出现“缺少对象或列名”
【发布时间】:2021-05-25 05:32:30
【问题描述】:

我正在尝试制作一个工具,该工具可以获取从网站提取的数据文件并将该数据推送到 SQL 服务器。

我现有的结构使用 VBA 导航到网站、拉取和润色文件。然后它打开 Access 将数据导入 SQL Server,它有一系列基于 VBA 的报告工具指向它。

我想删掉其中的访问部分,只需将更新查询从 VBA 发送到服务器。

源文件有 104 列。我制作了新工具,它可以访问网站、提取文件、将数据移动到工具的工作簿并进行转换。

这是我为构建更新查询而编写的代码:

SQL = "Insert Into datafile(" & HVal1 & "," & HVal2 & "," & HVal3 & "," & HVal4 & "," & HVal5 & "," & HVal6 & "," & HVal7 & "," & HVal8 & "," & HVal9 & "," & HVal10 & "," & HVal11 & "," & HVal12 & "," & HVal13 & "," & HVal14 & "," & HVal15 & "," & HVal16 & "," & HVal17 & "," & HVal18 & "," & HVal19 & "," & HVal20 & "," & HVal21 & "," & HVal22 & "," & HVal23 & "," & HVal24 & "," & HVal25 & "," & HVal26 & "," & HVal27 & "," & HVal28 & "," & HVal29 & "," & HVal30 & "," & HVal31 & "," & HVal32 & "," & HVal33 & "," & HVal34 & "," & HVal35 & "," & HVal36 & "," & HVal37 & "," & HVal38 & "," & HVal39 & "," & HVal40 & "," & HVal41 & "," & HVal42 & "," & HVal43 & "," & HVal44 & "," & HVal45 & "," & HVal46 & "," & HVal47 & "," & HVal48 & "," & HVal49 & "," & HVal50 & "," & _
HVal51 & "," & HVal52 & "," & HVal53 & "," & HVal54 & "," & HVal55 & "," & HVal56 & "," & HVal57 & "," & HVal58 & "," & HVal59 & "," & HVal60 & "," & HVal61 & "," & HVal62 & "," & HVal63 & "," & HVal64 & "," & HVal65 & "," & HVal66 & "," & HVal67 & "," & HVal68 & "," & HVal69 & "," & HVal70 & "," & HVal71 & "," & HVal72 & "," & HVal73 & "," & HVal74 & "," & HVal75 & "," & HVal76 & "," & HVal77 & "," & HVal78 & "," & HVal79 & "," & HVal80 & "," & HVal81 & "," & HVal82 & "," & HVal83 & "," & HVal84 & "," & HVal85 & "," & HVal86 & "," & HVal87 & "," & HVal88 & "," & HVal89 & "," & HVal90 & "," & HVal91 & "," & HVal92 & "," & HVal93 & "," & HVal94 & "," & HVal95 & "," & HVal96 & "," & HVal97 & "," & HVal98 & "," & HVal99 & "," & HVal100 & "," & HVal101 & "," & HVal102 & "," & HVal103 & ") " & _
"Values(" & VVal1 & "," & VVal2 & "," & VVal3 & "," & VVal4 & "," & VVal5 & "," & VVal6 & "," & VVal7 & "," & VVal8 & "," & VVal9 & "," & VVal10 & "," & VVal11 & "," & VVal12 & "," & VVal13 & "," & VVal14 & "," & VVal15 & "," & VVal16 & "," & VVal17 & "," & VVal18 & "," & VVal19 & "," & VVal20 & "," & VVal21 & "," & VVal22 & "," & VVal23 & "," & VVal24 & "," & VVal25 & "," & VVal26 & "," & VVal27 & "," & VVal28 & "," & VVal29 & "," & VVal30 & "," & VVal31 & "," & VVal32 & "," & VVal33 & "," & VVal34 & "," & VVal35 & "," & VVal36 & "," & VVal37 & "," & VVal38 & "," & VVal39 & "," & VVal40 & "," & VVal41 & "," & VVal42 & "," & VVal43 & "," & VVal44 & "," & VVal45 & "," & VVal46 & "," & VVal47 & "," & VVal48 & "," & VVal49 & "," & VVal50 & "," & _
VVal51 & "," & VVal52 & "," & VVal53 & "," & VVal54 & "," & VVal55 & "," & VVal56 & "," & VVal57 & "," & VVal58 & "," & VVal59 & "," & VVal60 & "," & VVal61 & "," & VVal62 & "," & VVal63 & "," & VVal64 & "," & VVal65 & "," & VVal66 & "," & VVal67 & "," & VVal68 & "," & VVal69 & "," & VVal70 & "," & VVal71 & "," & VVal72 & "," & VVal73 & "," & VVal74 & "," & VVal75 & "," & VVal76 & "," & VVal77 & "," & VVal78 & "," & VVal79 & "," & VVal80 & "," & VVal81 & "," & VVal82 & "," & VVal83 & "," & VVal84 & "," & VVal85 & "," & VVal86 & "," & VVal87 & "," & VVal88 & "," & VVal89 & "," & VVal90 & "," & VVal91 & "," & VVal92 & "," & VVal93 & "," & VVal94 & "," & VVal95 & "," & VVal96 & "," & VVal97 & "," & VVal98 & "," & VVal99 & "," & VVal100 & "," & VVal101 & "," & VVal102 & "," & VVal103 & ") """

HVal 值是简单的 cell.value 引用。 VVal 值是相同的,想法是设置 HVals,然后启动循环,分配 VVal,更新 SQL,通过更新引擎触发它,重复直到文件完全导入。

这是我卡住的地方。如果我为 SQL 语句运行编译,将生成的字符串打印到一个单元格,即:

Workbooks("Tool.xlsm").Sheets("Buttons").Cells(1, 1).Value = SQL

从 Workbooks("Tool.xlsm").Sheets("Buttons").Cells(1, 1).Value 手动复制该字符串,并将其直接粘贴到 'SQL=""' 语句中,然后运行更新,可以了。

如果我没有将值打印到单元格,而是将原始 SQL 语句发送到更新模块,则会收到“缺少对象或列名”错误。

如果我将 SQL 重新设置为等于原始 SQL 打印到的单元格的值,即:

Workbooks("Tool.xlsm").Sheets("Buttons").Cells(1, 1).Value  = SQL
SQL = Workbooks("Tool.xlsm").Sheets("Buttons").Cells(1, 1).Value

并将其发送到更新模块,同样的“缺少对象或列名”错误。

它唯一起作用的时候是当我复制第一块代码生成的字符串并打印到单元格 Workbooks("Tool.xlsm").Sheets("Buttons").Cells(1, 1).Value ,将其粘贴回 VBA 编辑器,用引号将其关闭,并将其存储为“SQL=”。

对于为什么我收到这些错误消息是因为生成“SQL”变量的 2 种手动方法,但看似简单但并没有真正改变任何东西的手动步骤可以让事情正常工作,是否有人敲响了警钟?

【问题讨论】:

  • 是的,“为什么要使用动态 SQL”的钟声响得很响。您应该使用可以进行导入/导出的适当软件,例如 SSIS。如果您想自己编写代码,请不要在 VBA 中进行,否则您将陷入痛苦的世界。
  • 可能你的“更新模块”有问题
  • 好的,你给我们完整编译的查询怎么样,显然有一个错误。看起来你缺少一堆单引号
  • "," & VVal103 & ") """ - 为什么您的 SQL 字符串以单个嵌入式双引号结尾?
  • @Tim Williams FTW。如此愚蠢的错误,但这就是问题所在。谢谢!

标签: sql-server vba


【解决方案1】:

令人尴尬的最低挂果。

动态 SQL 语句的最后 3 个字符是 '"""'。去掉 2 个错误的双引号,存储在变量中的语句不会以 ')"' 结尾。

从单元格中复制它并将其粘贴回 vb 编辑器,我添加了 3 个引号来手动构建我应该需要添加 4 的语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多