【问题标题】:Execute SQL procedure code via query string on Excel VBA (query table same workbook)通过 Excel VBA 上的查询字符串执行 SQL 过程代码(查询表相同的工作簿)
【发布时间】:2017-07-28 18:47:26
【问题描述】:

SQL 新手。我正在尝试通过 excel VBA 通过查询字符串执行 SQL 代码,以测试来自存储在同一工作簿工作表中的表的动态数据透视查询。正常查询工作正常(SELECT),但 SQL 语句不能。

我一次又一次收到Invalid SQL statement expected; 'DELETE','INSERT'...错误

我想要实现的是一个 sql 查询来检索动态数据透视(行到变量列)。我不想通过数据透视表来实现这一点,我想通过 VBA 的 SQL 字符串查询来实现。

Sample data

如何做到这一点?

    On Error GoTo ErrorConexion
    objAdoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & ThisWorkbook.path & "\" & ThisWorkbook.Name & ";" & _
     "Extended Properties=""Excel 8.0;HDR=YES;FMT=Delimited; IMEX=1;"""

    strSQL = "SET NOCOUNT ON " & Chr(13) _
        &  "CREATE TABLE #tempdata(tmpf1 date, tmpf2 int)" _
        & " INSERT INTO #tempdata(tmpf1,tmpf2)" _
        & " SELECT [DATE], [AMOUNT] FROM " & GetTableRange(StrTable)

    On Error GoTo ErrorSQL
    objAdoRS.Open strSQL, objAdoConn

我想执行这样的代码:

DECLARE @Category AS VARCHAR(MAX)
SELECT @Category = 
    COALESCE(@Category + ', ', '') + CAST(Category AS VARCHAR(20)) 
    FROM (SELECT DISTINCT Category FROM mytable) Books
DECLARE @DynamicPIVOT AS VARCHAR(MAX)
SELECT @DynamicPIVOT = 'SELECT ' + @Category +
' FROM (
    SELECT amount, Category FROM mytable
) Books
PIVOT (
    MAX(amount) FOR Category IN (' + @Category + ')
) Result;'

EXEC (@DynamicPIVOT)

问候, 文斯。

【问题讨论】:

  • 您正在尝试使用 Jet/ACE(两种不同的 SQL 引擎和方言)复制 SQL Server 存储过程(一个复杂的动态数据透视表)。此外,您不能像在存储过程中那样使用 ADO 在一次调用中发送多个 SQL 命令。请向我们展示数据和所需的输出。
  • 谢谢 Parfait,我正在融入很多环境。我添加了示例数据。

标签: sql excel vba ado


【解决方案1】:

只需使用JET/ACE SQL 自己的crosstab query 即可动态运行数据透视查询。

strSQL = "TRANSFORM MAX(t.[AMOUNT]) AS MaxAmount" _
           & " SELECT t.[DATE] " _
           & " FROM [SheetName$] t" _
           & " GROUP BY t.[DATE]" _
           & " PIVOT t.[PEOPLE]"

请注意:有 255 列的限制。因此,如果 PEOPLE 超过 254,则需要进行调整。

【讨论】:

  • 太棒了。可以通过“联合所有”声明来完成吗?我的意思是,首先联合来自多个表的所有数据,然后交叉表,所有内容都在同一个查询中。非常感谢。
  • 我已经了解了如何使用 UNION ALL 来实现。在不使用存储过程的情况下进行数据透视动态查询是多么简单的解决方案。我花了几个小时试图获得我的数据视图。再次感谢。
  • 太好了,很高兴为您提供帮助!请记住,此交叉表查询只能与 Jet/ACE(MS Access dbs、Excel wbs)一起使用,而不能与 SQL Server 等其他 RDBMS 一起使用。请接受此解决方案以确认解决方案(在旁边打勾)-“谢谢”的 SO 版本!
【解决方案2】:

你试过了吗?比创建临时表、插入和选择要容易得多。您正在通过一个 select 语句直接插入临时表。

  & "SELECT [DATE], [AMOUNT] INTO #TempData FROM " & 
  GetTableRange(StrTable) 

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多