数据透视表:由于临时表而处理大型 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的主要内容,如果未能解决你的问题,请参考以下文章
我的 Octobercms 数据透视表获取模型表在我尝试添加时应获取的数据