我的临时表中已有值,我想将其插入到我的表中。
我遵循这个语法
IF NOT EXISTS (SELECT 1 FROM ABC abc JOIN #Temp t ON abc.ID = t.ID)
insert into MyTable(Id,Name)
select values (t.ID, t.Name)
From t
Run Code Online (Sandbox Code Playgroud)
我只有名称 t 作为我在插入之前在条件中创建的别名。
它是否正确?有些人使用@等。我很困惑。
如果这个问题已经在其他地方得到了回答,我深表歉意,恐怕我需要对 PostgreSQL 中的 UPDATE FROM 子句进行更多的澄清/整理。
基本上我有一个临时表,其中包含一些中间计算的内容,我想用它们来更新主表。这个临时表包含两个外键和一个分数,例如:
score fk_offer fk_searchprofile
65 1764 12345
...
Run Code Online (Sandbox Code Playgroud)
我测试了要使用选择更新的行(该表temp_offerids_with_score包含需要更新的报价):
SELECT s.pkid, tmp.fk_offer, s.fk_category, tmp.score, tmp.fk_searchprofile
FROM
temp_weighted_scores_offers AS tmp
INNER JOIN sc_sp_o_c_score AS s
ON tmp.fk_offer = s.fk_offer
WHERE
tmp.fk_offer IN (SELECT fk_offer FROM temp_offerids_with_score)
AND
s.fk_category = 1
AND s.fk_searchprofile = 12345;
Run Code Online (Sandbox Code Playgroud)
这将正确返回预期的行数(在本例中为 10):
pkid fk_offer fk_category score fk_searchprofile
1 47 1 78 12345
2 137 1 64 12345
3 247 1 50 12345
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我在 UPDATE FROM 中使用相同的内容:
UPDATE sc_sp_o_c_score …Run Code Online (Sandbox Code Playgroud) 我正在尝试从另一个表在 SQL Server 中创建临时表,例如在 Redshift 中我执行以下操作
Create temporay table CARS as (
SELECT *
FROM BD_CARS_111
);
SELECT *
FROM CARS;
Run Code Online (Sandbox Code Playgroud)
SQL SERVER中有类似的语句吗?
我使用存储过程超过1.5年.但我从未考虑过如何从UI或其他存储过程中检索数据.
当我写一个简单的存储过程.例如.
CREATE PROCEDURE sp_test
AS
BEGIN
SELECT * FROM tblTest --Considering table has 3 columns.
END
Run Code Online (Sandbox Code Playgroud)
C#如何将此结果导入DataTable.
每当我必须在另一个过程中使用此过程的结果时,我认为我们必须使用table数据类型创建一个表值参数,并将其结果分配给表变量.我从来没有尝试过.
CREATE PROCEDURE sp_testcall
AS
BEGIN
@temp = exec sp_test -- I think this would be the way, never tried
END
Run Code Online (Sandbox Code Playgroud)
如果上面的示例代码为true,那么使用上述方法和查询将记录插入临时表之间有什么区别?
CREATE PROCEDURE sp_test
AS
BEGIN
SELECT * INTO #tmp FROM tblTest --Considering table has 3 columns.
END
Run Code Online (Sandbox Code Playgroud)
似乎将结果复制到临时表需要sql server的另一项努力.但幕后会发生什么?它会直接将结果的引用分配给表值参数,还是使用与临时表相同的过程?
我的问题可能不太清楚.但我会尽力改进.
我目前有一个主存储过程调用许多存储过程:
Main --|
--|
--| > Exec Pre-processing SP (create and populate #temp table)
--|
--| > Exec Actual update
--|
--| > Exec Post-Process (consume and drop #temp table)
Run Code Online (Sandbox Code Playgroud)
我目前遇到的问题是我需要从数据库中获取原始值,并将值传递到主存储过程,以便我可以在最后一步(存储过程)中调用更新后处理.
我无法更改存储过程签名或主存储过程.
当我尝试执行此方案时,我在后处理存储过程中得到一个无效对象.
如何将值从第一个存储过程传递到最后一个存储过程.
嗨,当我执行以下TSQL时,我收到以下错误消息.但是SQL语法有什么不对吗?
create table #tb ([t1] tinyint, [t2] varchar(50))
insert into #tb values
(1, 'a'),
(2, 'b')
Run Code Online (Sandbox Code Playgroud)
消息102,级别15,状态1,行3'','附近的语法不正确.
SQL查询窗口中没有其他内容.运行SQL Server 2005.
我需要在InventTrans上循环以累积某些日期的itemId数量,并使用此临时表作为数据源在表单中填充结果的临时表.我使用了一个类,对于一个itemId,这个过程很长(约5-10秒).
哪个代码最快?
我该如何改进我的代码?
我有本地表和字符串,必须从其值填充:
DECLARE @#SomeTable TABLE ( some columns ..)
DECLARE @SomeString varchar(8000) = 'init string'
Run Code Online (Sandbox Code Playgroud)
迭代它
WHILE EXISTS(SELECT * FROM @#SomeTable)
BEGIN
// [somecolumn] is declared temp variable
SELECT TOP 1 @somecolumn = somecolumn FROM @#SomeTable
PRINT 'before ' + @SomeString // 'init string'
PRINT [some values from SomeTable] // this OK
SET @SomeString += [some values from SomeTable]
PRINT 'after ' + @SomeString //'init string' UPDATE NOT TAKE PLACE!!!!
DELETE @#SomeTable Where somecolumn = @somecolumn
END
Run Code Online (Sandbox Code Playgroud)
我发现连接失败了.为什么?
编辑:
这是一段原始代码:
/*Represents …Run Code Online (Sandbox Code Playgroud) 我对临时表有一个非常奇怪的问题.我在代码中创建一个临时表,它显示在MSSQL中的tempdb.sys.tables下,但是如果我尝试从中选择,我会得到一个
无效的对象名称'#Update'.错误
如果我将创建临时表sql直接从我的代码中剪切并粘贴到mssql管理器中并运行它,它将创建临时表,我可以从中进行选择.然后它将在tempdb.sys.tables中显示两个ideintical临时表.
也许我忽略了一些东西,但这看起来很奇怪.
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
//Execute the command to make a temp table
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "create table #UpdatePOS (Store_ID nvarchar(50), POSItem_Id nvarchar(50), POSSalesDate datetime, LastModifiedWhen datetime, UpdateResult bit, QTY decimal(18,0));";
cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
在Oracle数据库中编写某些过程(使用18c)时,我遇到了一个问题,我试图用BLOB数据类型的列定义PRIVATE临时表,但它没有让我.
PRIVATE创建临时表的代码(还有一些其他列,但我注释掉了每个其他列,除了下一段中提到的那两列):
CREATE PRIVATE TEMPORARY TABLE ora$ptt_Test (
id NUMBER(19),
userdata BLOB);
Run Code Online (Sandbox Code Playgroud)
当我尝试执行上面的语句时,我得到:ORA-14451:不支持的功能,临时表14451. 00000 - "不支持的功能与临时表"*原因:尝试创建IOT,指定物理属性,指定分区或平行条款.*行动:不要这样做.
但如果我评论userdata列,它会成功执行.
我在Oracle 18c文档中找到的所有内容是,创建PRIVATE临时表(自18c以来可用)的限制/约束应该与PUBLIC临时表(在版本18c之前也可用)相同,但事实并非如此,因为我试图用BLOB列定义PUBLIC临时表,并且它有效.
我真的很感激任何帮助.
temp-tables ×10
sql-server ×5
sql ×4
t-sql ×3
ado.net ×1
axapta ×1
blob ×1
c# ×1
database ×1
oracle ×1
postgresql ×1
sql-update ×1
x++ ×1