我有一个关于 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
有没有办法在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中获取临时表的列名的任何其他原语?
我让用户输入我需要在表中查询的值列表。该列表可能非常大,并且长度在编译时未知。我认为使用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。
谢谢!
我正在尝试创建一个执行此操作的函数:
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) 我在 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) 我有一个查询需要相当长的时间(大约 1100 万个观察值)和三个连接(我无法阻止它进行检查)。其中一个连接是使用临时表。
当我使用其中包含主键的表中的数据创建临时表时,新表是否会继承索引,或者我是否必须在新临时表中显式创建索引(使用父表中的主键)桌子)?
我正在尝试更改在存储过程中创建并填充的现有临时表,在我正在执行这些更改时调用此表.我无法更改调用存储过程,我需要将列添加到临时表,所以我尝试了这个:
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'
看起来这个代码甚至没有被执行.
有人可以告诉我这是否可能以及如何?
谢谢.
我有一个返回此结果的存储过程:
我调用存储过程的方式是:
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 失败,因为存储过程更改了目标表的架构。
我们在开发过程中遇到了一个奇怪的问题,正在寻找有关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
我正在尝试在过程中创建并填充临时表,以保存我正在使用的数据的一些中间状态。
我创建了一个示例代码来解释我想要做什么:
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
temp-tables ×10
sql ×6
sql-server ×4
postgresql ×3
mysql ×2
indexing ×1
json ×1
memory-table ×1
plpgsql ×1
sybase ×1
transactions ×1