【问题标题】:How To Insert Data Into Temp Table From Different Databases如何将来自不同数据库的数据插入到临时表中
【发布时间】:2022-01-25 02:30:52
【问题描述】:

我正在尝试将来自 2 个不同数据库的 2 个表中的数据插入到临时表中。这是因为我需要一个数据来在另一个中创建唯一标识符。

这是我目前拥有的:

-- Create Temp table for data manipulation
IF OBJECT_ID('tempdb..#Staging') IS NOT NULL
    DROP TABLE #Staging

CREATE TABLE #Staging
(
    InitialChildValue nvarchar(4000),
    PropertyNumber nvarchar(10),
    NewYearValue nvarchar(2),
    NewChildValue nvarchar(4000)
)

--Insert initial data into temp table
INSERT INTO #Staging (InitialChildValue, PropertyNumber, NewYearValue, NewChildValue)
    SELECT combo.ChildValue, combo.TABLE_NO, '22' AS YEAR, ''
    FROM 
        (SELECT ChildValue, NULL AS TABLE_NO 
         FROM [DB1].[Version].[Token] 
         WHERE DeletedTransactionKey IS NULL
         UNION
         SELECT NULL AS ChildValue, TABLE_NO 
         FROM [DB2].[dbo].[Notice]
         -- WHERE NOTICE_RUN_CTR = @NoticeRunCTR
        ) combo

但是这个查询返回的是这样的:

ChildValue TABLE_NO YEAR (empty)
1 22
2 22
3 22
a 22
b 22
c 22

我想要实现的是这样的:

ChildValue TABLE_NO YEAR (empty)
1 a 22
2 b 22
3 c 22

在我的存储过程中,我将继续创建一个类似“FY1a22”的 ID,并根据已存储在临时表中的初始 ChildValue 更新 DB1 中的 Token 表。

例如大致写成:

UPDATE DB1.Notice
SET ChildValue = NewChildValue
WHERE ChildValue = #Staging.ChildValue

(我知道这不是正确的语法,我只是简写)

不幸的是,数据库之间没有链接,这就是我尝试这样做的原因。

非常感谢任何想法或建议。

【问题讨论】:

  • 显然我不知道如何格式化问题中的表格:)
  • 您需要提供联合语句中的数据之间的关系。如果它们以相同的方式排序而没有间隙或存在外键关系,那么答案将很容易。如果它们是彼此没有关系的堆,那么答案将很难想象。

标签: sql sql-server temp-tables


【解决方案1】:

您可以使用row_number() 生成一个序列号,并使用它来连接来自TokenNotice 的行

似乎没有关于如何链接ChildValueTable_No 的关系。根据提供的预期结果,我假设它会按其价值进行

SELECT t.ChildValue, n.TABLE_NO, '22' AS YEAR, ''
FROM 
(
    SELECT ChildValue, 
           RN = ROW_NUMBER() OVER (ORDER BY ChildValue)
    FROM   [DB1].[Version].[Token] 
    WHERE DeletedTransactionKey IS NULL
) t
INNER JOIN
(
    SELECT TABLE_NO,
           RN = ROW_NUMBER() OVER (ORDER BY TABLE_NO) 
    FROM [DB2].[dbo].[Notice]
) n
ON t.RN = n.RN

【讨论】:

  • 这非常有效。您是正确的,两列/表/数据库之间没有关系,因此无需关心/担心哪个 ChildValue 分配给哪个 Table_No。添加行号并加入它正是需要的。非常感谢。
猜你喜欢
  • 2017-12-20
  • 2017-04-02
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多