我有一个关于 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
目标
CREATE TEMPORARY TABLE在不使用本机 SQL 的情况下调用Hibernate 中的语句。这意味着仅使用 HQL 或 Hibernate API。DROP完成后的临时表。(我知道没有必要,但我认为这样做是一个好习惯。)背景
Save,值必须保存在单个事务中。SELECT视图上的语句。UPDATE视图上的语句,它调用视图的INSTEAD OF触发器。(I)的值是4当用户显示 Web 表单时,(II)另一个用户将同一字段更新为5 (III)第一个用户更新该字段2并提交 Web 表单。最初提出的解决方案
stored-procedures hibernate transactions temp-tables database-versioning
我让用户输入我需要在表中查询的值列表。该列表可能非常大,并且长度在编译时未知。我认为使用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。
谢谢!
我正在尝试优化具有如下代码的过程:
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 Server 2008 R2 中有一个全局临时表。我需要一个生成脚本的方式与我们在 SSMS 中通过“脚本表作为”->“创建到”生成脚本的方式相同。
我实际上并没有创建临时表。我只是想使用它的模式来创建一个表,这样我就可以在事务期间将数据永久存储在我的表中。
我收到一个错误,指出 #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)
任何建议将不胜感激。
谢谢,
在我的 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
这就是我找不到的原因吗?有什么办法可以改变吗?这对我来说是新的......
我目前正在协助将当前针对 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) 我正在尝试更改在存储过程中创建并填充的现有临时表,在我正在执行这些更改时调用此表.我无法更改调用存储过程,我需要将列添加到临时表,所以我尝试了这个:
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 失败,因为存储过程更改了目标表的架构。
temp-tables ×10
sql ×6
sql-server ×6
transactions ×2
hibernate ×1
mysql ×1
mysql-5.6 ×1
mysql-5.7 ×1
postgresql ×1
readonly ×1
self-join ×1
t-sql ×1