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

时间:2016-01-08 10:33:28

标签: sql sql-server excel pivot temp-tables

对于数据透视表的连接,我有以下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

1 个答案:

答案 0 :(得分:0)

我现在找到了一种方法,它不是百分之百的傻瓜证明,因为它并不总是稳定的(例如,它在我第一次打开文件时从不工作,但每次都在以后)。

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

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

Button

插入行的查询仍然以相同的方式完成,但仅适用于全局临时表并在VBA中执行。

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);

现在就这样做了:

  1. 通过VBA创建全局临时表。
  2. 生成命令文本代码 也在VBA。
  3. 刷新包含删除的数据库连接 全球临时表。