标签: 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
查看次数

获取sybase中Temp表的列

有没有办法在sybase中获取临时表的列列表?假设我有一个名为#mytable的表

select count (*) from  tempdb..#mytable
Run Code Online (Sandbox Code Playgroud)

返回145表示此表中有145行.我尝试了以下(有一些变化)

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = '#mytable'
Run Code Online (Sandbox Code Playgroud)

也试过了

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = 'tempdb..#mytable'
Run Code Online (Sandbox Code Playgroud)

两人都回来了,结果空洞.

有任何想法吗?在sybase中获取临时表的列名的任何其他原语?

sql sybase temp-tables

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

使用临时表替换 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
查看次数

在plpgsql函数中的PostgreSQL CREATE TEMPORARY TABLE

我正在尝试创建一个执行此操作的函数:

drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * from t_rv_openitem;
Run Code Online (Sandbox Code Playgroud)

当涉及到PostgreSQL中的函数时,我有时会感到困惑并得到此错误:

发生了错误:

错误:语法错误在"DROP"处或附近第3行:DROP TABLE t_rv_openitem;

我知道这似乎是一个简单的任务,但我正在试图解决这个问题.

这是完整的函数create语句:

CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
  RETURNS rv_openitem AS
$BODY$

Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere; 
Run Code Online (Sandbox Code Playgroud)

postgresql temp-tables plpgsql

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

如果我不删除临时 MEMORY 表,它会持续多久(MySQL)

我在 MySQL 中使用递归存储过程来生成一个名为的临时表id_list,但我必须在后续选择查询中使用该过程的结果,因此我无法DROP在过程中使用临时表...

BEGIN;

/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);

/* uses the results of the SPROC in the WHERE */
SELECT a.User_ID
FROM usr_relationships r 
INNER JOIN usr_accts a ON a.User_ID = r.User_ID 
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) 
GROUP BY r.User_ID;

COMMIT;
Run Code Online (Sandbox Code Playgroud)

调用过程时,第一个值是我想要的分支的顶部ID,第二个值是tier过程在递归期间使用的。在递归循环之前,它会检查是否tier = 0运行:

DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT …
Run Code Online (Sandbox Code Playgroud)

mysql stored-procedures temp-tables memory-table

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

MySQL:创建临时表时是否自动创建主键?

我有一个查询需要相当长的时间(大约 1100 万个观察值)和三个连接(我无法阻止它进行检查)。其中一个连接是使用临时表。

当我使用其中包含主键的表中的数据创建临时表时,新表是否会继承索引,或者我是否必须在新临时表中显式创建索引(使用父表中的主键)桌子)?

mysql sql indexing temp-tables

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

在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
查看次数

使用来自 OPENJSON 的临时表进行 SELECT INTO 时 SQL Server 自死锁

我们在开发过程中遇到了一个奇怪的问题,正在寻找有关SELECT INTO临时表上的自死锁问题的解释。

我们有一个例程将一些相当复杂的 JSON 文档转换为表格形式。我们目前正在使用 来完成此任务OPENJSON,通常效果很好。

这种转变是在触发器的背景下发生的。当向表中插入一行或多行时,会生成一组 JSON 文档,将其存储在单个变量中,并传递到以下例程中。它看起来像这样:

SELECT 
a.[ID],
b.[Some stuff here...]
INTO #MyTempTable
FROM OPENJSON(@MyJSONDocuments)
WITH (
    ID VARCHAR(40),
    nestedDocument NVARCHAR(MAX) AS JSON) a
CROSS APPLY OPENJSON(nestedDocument ,'$') b
Run Code Online (Sandbox Code Playgroud)

当我们在 SSMS 中运行它时,它工作得很好。临时表已生成并填充,没有问题。当我们将其移至触发器并仅将一行插入基础表(即@MyJSONDocuments单个文档的数组)时,它也可以正常工作。当我们插入两行或更多行,并且@MyJSONDocuments数组中包含多个文档时,我们会遇到可怕的情况:

Transaction (Process ID x) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Run Code Online (Sandbox Code Playgroud)

当我们将SELECT INTO语句包装在 SSMS 中的 aBEGIN TRAN / COMMIT …

sql-server json temp-tables sqlperformance database-deadlocks

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

Postgres 中过程内的临时表

我正在尝试在过程中创建并填充临时表,以保存我正在使用的数据的一些中间状态。

我创建了一个示例代码来解释我想要做什么:

CREATE OR REPLACE PROCEDURE etl.my_test_procedure()
LANGUAGE sql
AS 
$$
   CREATE TEMP TABLE IF NOT EXISTS my_temp(
       var1 VARCHAR(255),
       var2 VARCHAR(255)
   ) ON COMMIT DROP;
    
   INSERT INTO my_temp (
       var1,
       var2
   )
   SELECT 
       table_schema,
       column_name
   FROM information_schema.columns;

   SELECT 
        *
   FROM my_temp
$$
Run Code Online (Sandbox Code Playgroud)

尝试创建此存储过程时,数据库返回以下错误消息: 错误:关系“my_temp”不存在第 10 行:INSERT INTO my_temp (^ SQL 状态:42P01 字符:171

PD:我的 Postgres 版本是 13.3

postgresql stored-procedures temp-tables postgresql-13

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