数据透视表:由于临时表而处理大型 CommandText

Posted

技术标签:

【中文标题】数据透视表:由于临时表而处理大型 CommandText【英文标题】:PivotTable: Dealing with large CommandText due to temporary table 【发布时间】:2016-01-08 10:33:27 【问题描述】:

我有以下CommandText 用于数据透视表的连接:

SET NOCOUNT ON
CREATE TABLE #temptable
(KonPos integer, KonStk integer);
INSERT INTO #temptable (KonPos, KonStk) Values
(1,1),(2,1),(3,1);

SELECT
  a.*,
  b.*
FROM
  #temptable a LEFT JOIN dbTable b ON a.KonPos = b.Position

DROP TABLE #temptable;

我正在使用 VBA 创建插入的行,而临时表比这要复杂一些,但不用说,字符串变得太大了。

如果有人想知道我是如何创建查询的:

sQuery = sQuery & "INSERT INTO #temptable (KonPos, KonStk) Values" & Chr(10)
sQuery = sQuery & Join(TableRows, ",") & ";"

此命令替换 CommandText: wbCn.CommandText = ReplaceQueryTempTalbe(sQuery, wbCn.CommandText)

它只是用表格行替换查询中的占位符。

任何人都有可行的解决方案?我对各种想法持开放态度。

编辑:

DBMS:
Microsoft SQL Server Management Studio 2012                     11.0.2100.60

【问题讨论】:

您使用的是哪个 dbms? 感谢您的评论,添加它,它是MSSQL 2012 【参考方案1】:

我现在找到了一种方法,它不是 100% 万无一失的,因为它并不总是稳定的(例如,它在我第一次打开文件时从不工作,但之后每次打开)。

为我做这件事的方式: 在数据库中创建一个全局临时表,消除连接命令文本中的限制。

为此,我更改了数据透视表的命令文本:

SET NOCOUNT ON
CREATE TABLE #temptable
(KonPos integer, KonStk integer);

DECLARE @sqlCommand nvarchar(1000);
INSERT INTO #temptable (KonPos, KonStk)    
SELECT * FROM ##GlobalTempTable;
SET @sqlCommand = 'DROP TABLE ##GlobalTempTable';

SELECT
  a.*,
  b.*
FROM
  #temptable a LEFT JOIN dbTable b ON a.KonPos = b.Position

DROP TABLE #temptable;
EXEC (@sqlCommand);

插入行的查询仍然以相同的方式完成,但只是针对全局临时表并在 VBA 中执行。

Private Sub GlobalTempTableErstellen(GlobalTempTableName As String)
Dim cn As New ADODB.Connection
Dim sQuery As String

cn.Open strConnection

sQuery = "SET NOCOUNT ON" & _
        " CREATE TABLE " & GlobalTempTableName & _
        " (KonPos integer, KonStk integer); " & _
        CreateTempTable(GlobalTempTableName)

cn.Execute sQuery
cn.Close
End Sub

所以现在的做法是:

    通过 VBA 创建全局临时表。 生成命令文本代码 也在 VBA 中。 刷新数据库连接,包括删除 全局临时表。

【讨论】:

以上是关于数据透视表:由于临时表而处理大型 CommandText的主要内容,如果未能解决你的问题,请参考以下文章

如何创建临时表而不丢失 django 中的 ORM?

将动态数据透视的结果存储到临时表

具有大型数据集的 SQL Server 中的数据透视表

我的 Octobercms 数据透视表获取模型表在我尝试添加时应获取的数据

使用数据透视表关系提高大型数据集的性能(使用 Laravel)

由于加入表而导致的记录重复