标签: temp-tables

SQL Server 2005 中 CTE 的评估

我有一个关于 MS SQL 如何评估 CTE 内的函数的问题。几次搜索没有找到与此问题相关的任何结果,但如果这是常识并且我只是落后于潮流,我深表歉意。这不是第一次了:-)

这个查询是我实际正在做的事情的简化(并且显然不太动态)版本,但它确实展示了我遇到的问题。它看起来像这样:

CREATE TABLE #EmployeePool(EmployeeID int, EmployeeRank int);

INSERT INTO #EmployeePool(EmployeeID, EmployeeRank)
  SELECT 42, 1
  UNION ALL 
  SELECT 43, 2;

DECLARE @NumEmployees int;
SELECT @NumEmployees  = COUNT(*) FROM #EmployeePool;

WITH RandomizedCustomers AS (
  SELECT CAST(c.Criteria AS int) AS CustomerID,
         dbo.fnUtil_Random(@NumEmployees) AS RandomRank
    FROM dbo.fnUtil_ParseCriteria(@CustomerIDs, 'int') c)
SELECT rc.CustomerID,
       ep.EmployeeID
  FROM RandomizedCustomers rc
  JOIN #EmployeePool ep ON ep.EmployeeRank = rc.RandomRank;

DROP TABLE #EmployeePool;
Run Code Online (Sandbox Code Playgroud)

对于上述所有执行,可以假设以下情况:

  • 的结果dbo.fnUtil_Random()始终是一个大于零且小于或等于传入参数的 int 值。由于上面调用它的@NumEmployees值为 2,因此该函数的计算结果始终为 1 或 2。

  • 的结果 …

sql sql-server sql-server-2005 temp-tables common-table-expression

5
推荐指数
1
解决办法
244
查看次数

如何在 Hibernate 中创建临时表?

目标

  1. CREATE TEMPORARY TABLE在不使用本机 SQL 的情况下调用Hibernate 中的语句。这意味着仅使用 HQL 或 Hibernate API。
  2. 将对象保存到临时表。
  3. 调用一个使用现有表和临时表的存储过程。
  4. DROP完成后的临时表。(我知道没有必要,但我认为这样做是一个好习惯。)

背景

  1. 我对 SQL 非常熟悉,但对 Hibernate 不熟悉。
  2. 由于某人的决定,我被迫在项目中使用 Hibernate。
  3. 我要将 Web 表单保存到 Oracle 数据库。
  4. Web 表单包含一个充满文本字段(由其他人设计)的表格,每个单元格中都有一个。
  5. 当用户单击 时Save,值必须保存在单个事务中。
  6. Web 表单由数据库视图支持。
  7. 数据库视图是使用 EAV 模式从数据库表创建的。(这样做是因为列在某种程度上是动态的。)
  8. Web 表单中的每个文本字段都由数据库表中的一行建模。
  9. 显示 Web 表单使用SELECT视图上的语句。
  10. 更新 Web 表单使用UPDATE视图上的语句,它调用视图的INSTEAD OF触发器。
  11. 仅更新更改的值。每个更新都有一个审计跟踪。
  12. 如果其他用户在没有通知的情况下更新了任何值,则事务将回滚。以下是此类场景的示例:a(I)的值是4当用户显示 Web 表单时,(II)另一个用户将同一字段更新为5 (III)第一个用户更新该字段2并提交 Web 表单。

最初提出的解决方案

  1. 使用 AJAX (jQuery) 检测文本字段中的更改,并仅提交用户更改的内容。
  2. 但是,需要在数据库中检测其他用户所做的更改。 …

stored-procedures hibernate transactions temp-tables database-versioning

5
推荐指数
1
解决办法
1万
查看次数

使用临时表替换 WHERE IN 子句

我让用户输入我需要在表中查询的值列表。该列表可能非常大,并且长度在编译时未知。我认为使用WHERE ... IN (...)临时表并对其执行联接会更有效,而不是使用它。我在另一个SO问题中读到了这个建议(目前找不到它,但会在找到时进行编辑)。

要点是这样的:

CREATE TEMP TABLE my_temp_table (name varchar(160) NOT NULL PRIMARY KEY);

INSERT INTO my_temp_table VALUES ('hello');
INSERT INTO my_temp_table VALUES ('world');
//... etc

SELECT f.* FROM foo f INNER JOIN my_temp_table t ON f.name = t.name;

DROP TABLE my_temp_table;
Run Code Online (Sandbox Code Playgroud)

如果我同时运行其中两个,那么如果线程 2 尝试在线程 1 之后创建 TEMP 表,我不会收到错误吗?

我应该为 TEMP 表随机生成一个名称吗?

或者,如果我将整个事情包装在一个事务中,命名冲突会消失吗?

这是 PostgreSQL 8.2。

谢谢!

sql postgresql transactions temp-tables

5
推荐指数
1
解决办法
7120
查看次数

临时表上的聚集索引

我正在尝试优化具有如下代码的过程:

CREATE TABLE #t1 (c1 int, c2 varchar(20), c3(varchar(50)...)

CREATE CLUSTERED INDEX ix_t1 ON #t1(c3) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我想通过将 CLUSTERED 索引移动到表声明中来改进它(更适合缓存),但是 c3 不是唯一的,所以这不起作用:

CREATE TABLE #t1 (c1 int, c2 varchar(20), c3 varchar(50)..., UNIQUE CLUSTERED (c3))
Run Code Online (Sandbox Code Playgroud)

有没有办法声明一个在临时表声明中不是唯一的集群?

sql t-sql sql-server temp-tables clustered-index

5
推荐指数
2
解决办法
1万
查看次数

创建临时表的脚本

我在 SQL Server 2008 R2 中有一个全局临时表。我需要一个生成脚本的方式与我们在 SSMS 中通过“脚本表作为”->“创建到”生成脚本的方式相同。

我实际上并没有创建临时表。我只是想使用它的模式来创建一个表,这样我就可以在事务期间将数据永久存储在我的表中。

sql sql-server temp-tables sql-server-2008

5
推荐指数
1
解决办法
7115
查看次数

#Table 有歧义

我收到一个错误,指出 #Plans 不明确。当我通过自连接将一个表加入到自己的表中时会发生这种情况,但不知道为什么。这是导致错误的代码:

Alter Table #Plans
Add SecondPlanDate date

Update #Plans
Set 
    SecondPlanDate = Min (P2.PlanPurchaseDate) Over (Partition By P1.PatientID, P1.PlanPurchaseDate)
From
#Plans as P1
Inner Join
#Plans as P2
on
P1.PatientID = P2.PatientID
Where
P2.PlanPurchaseDate > P1.PlanPurchaseDate
;

Select
*
From
#Plans  
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激。

谢谢,

temp-tables self-join sql-server-2008

5
推荐指数
1
解决办法
4863
查看次数

SQL Server - 如果不存在则创建临时表

在我的 SQL Server 2012 环境中,我创建了一系列存储过程,它们在它们之间传递预先存在的临时表(我在这里尝试了不同的架构,但由于需求/过程的性质而无法绕过它)。

我想做的是在存储过程中检查是否已经创建了临时表,如果没有,则创建它。

我当前的 SQL 如下所示:

IF OBJECT_ID('tempdb..#MyTable') IS NULL
    CREATE TABLE #MyTable
    (
        Col1 INT,
        Col2 VARCHAR(10)
        ...
    );
Run Code Online (Sandbox Code Playgroud)

但是当我在表已经存在的情况下尝试运行它,我收到错误消息

数据库中已经有一个名为“#MyTable”的对象

因此,它似乎并没有简单地忽略 If 语句中的那些行。

有没有办法做到这一点 - 如果临时表尚不存在,则创建一个临时表,否则,使用内存中已有的表?

谢谢!

更新:

无论出于何种原因,按照@RaduGheorghiu 从评论中提出的建议,我发现系统创建了一个临时表,其名称类似于 dbo.#MyTable________________________________________________0000000001B1

这就是我找不到的原因吗?有什么办法可以改变吗?这对我来说是新的......

sql-server stored-procedures temp-tables

5
推荐指数
1
解决办法
7466
查看次数

在只读事务中创建临时表 - MYSQL 5.7

我目前正在协助将当前针对 mysql 5.5 DB 运行的应用程序迁移到 mysql 5.7 的集成测试。我们遇到了与在 mysql 5.5 中优化的功能相关的问题,通过将某些部分封装在只读事务中现在抛出以下错误,运行速度提高了约 30%:

错误代码:1792 无法在 READ ONLY 事务中执行语句。

我已经在互联网上搜索并没有找到任何解决方案。我知道在 mysql 5.6文档中添加了一个相关的限制,其中提到:

“在只读模式下,仍然可以使用 DML 语句更改使用 TEMPORARY 关键字创建的表。不允许使用 DDL 语句进行更改,就像使用永久表一样。”

这给我们带来了一个主要限制,因为其中一些只读事务调用创建临时表的存储过程,并且我们无法重写应用程序,因为这种只读优化很普遍。

本质上,我们希望找到一种解决方法或一种我们可以调整的配置,以允许下面的示例不给出只读错误。

START TRANSACTION READ only;
CREATE TEMPORARY TABLE IF NOT EXISTS table1 (account_id INT(10) UNSIGNED);
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

事先创建表不是一个选项,如果需要,下面的 mysql 服务器会话变量。任何帮助将非常感激!

会话变量:

Variable_name   Value
auto_increment_increment    1
auto_increment_offset   1
autocommit  ON
automatic_sp_privileges ON
avoid_temporal_upgrade  OFF
back_log    80
basedir C:\\Program Files\\MySQL\\MySQL Server 5.7\\
big_tables  OFF
bind_address    *
binlog_cache_size   32768
binlog_checksum CRC32
binlog_direct_non_transactional_updates OFF
binlog_error_action …
Run Code Online (Sandbox Code Playgroud)

mysql temp-tables readonly mysql-5.6 mysql-5.7

5
推荐指数
1
解决办法
1535
查看次数

在SQL Server中的临时表中添加和更新列的后验

我正在尝试更改在存储过程中创建并填充的现有临时表,在我正在执行这些更改时调用此表.我无法更改调用存储过程,我需要将列添加到临时表,所以我尝试了这个:

ALTER TABLE #MyTemp 
ADD Column1 VARCHAR(100);           

UPDATE x
SET Column1 = a.SomeColumn
FROM #MyTemp x
INNER JOIN dbo.AnotherTable a (NOLOCK) ON a.ColumnName = x.ColumnName 
WHERE somecondition;
Run Code Online (Sandbox Code Playgroud)

它编译,但当我运行它我得到:

消息207,级别16,状态1,过程ProcName,行#
无效列名称'Column1'

看起来这个代码甚至没有被执行.

有人可以告诉我这是否可能以及如何?

谢谢.

sql sql-server stored-procedures temp-tables

5
推荐指数
2
解决办法
51
查看次数

将存储过程结果插入临时表

我有一个返回此结果的存储过程:

在此处输入图片说明

我调用存储过程的方式是:

Exec uspGetStandardUsingRoleandPhase '1908003'
Run Code Online (Sandbox Code Playgroud)

我想将这些结果存储到一个临时表中,所以我这样使用insert into

IF OBJECT_ID(N'tempdb.dbo.#tmp', N'U') IS NOT NULL
    DROP TABLE #tmp

CREATE TABLE #tmp
(
    startDate DATE,
    endDate DATE,
    strPhase NVARCHAR(50),
    strBadgeNumber NVARCHAR(30)
)

INSERT INTO #tmp (startDate, endDate, strPhase, strBadgeNumber)
    EXEC uspGetStandardUsingRoleandPhase '1908003'
Run Code Online (Sandbox Code Playgroud)

但我收到这样的错误:

INSERT EXEC 失败,因为存储过程更改了目标表的架构。

sql sql-server stored-procedures temp-tables

5
推荐指数
1
解决办法
4988
查看次数