gpt4 book ai didi

c++ - 微软 SQL 服务器 : Access a local temporary table in a prepared statement

转载 作者:行者123 更新时间:2023-11-28 02:30:25 25 4
gpt4 key购买 nike

问题陈述

我正在尝试创建并填充一个本地临时表,它现在运行良好,但之后我无法通过预查询访问该表及其内容。

问题的一个非常简化的版本,它已经重现了问题(C++0x with Qt5 framework):

// fyi: this constructor overload already executes the given query string
QSqlQuery query1("IF EXISTS(SELECT * FROM SYSOBJECTS WHERE ID=OBJECT_ID('#tmp') AND XTYPE='U') DROP TABLE #tmp", _db);
QSqlQuery query2("SELECT * INTO #tmp FROM mytable WHERE 1 = 0", _db);

// so far, so good: the table gets dropped if it was already existing and gets recreated with the schema of 'mytable'; it is empty due to the '1 = 0'

// this works: some code for inserting data
QSqlQuery query3("INSERT INTO #tmp SELECT mytable WHERE ...", _db);

// this also works: i can select some data
QSqlQuery query4("SELECT count(*) FROM #tmp WHERE col = 1234", _db);
Q_ASSERT(query4.hasNext());

// fails at exec() with error: "unkown object name '#tmp'"
QSqlQuery query5(_db);
query5.prepare("SELECT count(*) FROM #tmp WHERE col = :boundVar");
query5.bindValue(":boundVar", 1234);
query5.exec();

我在这里错过了什么?在我在 SQL Server documentation 中阅读此内容之前,我已经很难让创建临时表的查询运行。 :

In SQL Server 2005, the prepared statements cannot be used to create temporary objects [...], such as temporary tables. These procedures must be executed directly.

这已经很令人困惑了,因为我使用的是 SQL Server 2008r2 - 而为 Server 2012 编写的文档只提到了 2005 版本和更早的版本。尽管如此,我尝试在没有准备的情况下执行创建表的查询并且它有效(参见代码示例)。然而,引用并没有说明任何关于访问临时表的内容。

要求

由于性能原因,我必须使用本地临时表:相当大的数据集将被过滤和转换并插入到临时表中,其中大约 10 个查询将遵循并使用这个具体化的中间数据。 TVP 不是一个好的选择,因为它会大大减慢以下查询的速度。在我的案例中,创建临时表的开销确实得到了好几倍的返回。此外,本地临时表比其他解决方案更受青睐,因为它们与其他连接隔离并且在断开连接后将被清理,这正是我想要的。

有很多原因导致我不能没有准备好的语句来读取表格,所以我真的希望有人能帮助我解决这个问题。

真题

如何使用准备好的查询从我的本地临时表(当然是从创建它的同一连接中)读取数据?

非常感谢任何想法/解决方案!

最佳答案

如何将所有这些放在一个存储过程中,存储过程会创建一个以日期和时间以及用户 ID 为前缀的真实表。

大概是这样

创建表 someuser_190320151830....

如上构建动态sql语句填充表

从表中选择任何内容,以便您的应用可以使用它

删除表 someuser_190320151830

最后一步可能是选择数据然后删除表格。

除非同一个人设法在同一时间运行它,否则它可能会起作用。我曾使用过类似的方法,但它很少运行。

关于c++ - 微软 SQL 服务器 : Access a local temporary table in a prepared statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com