如何将来自不同数据库的数据插入到 Temp Table
How To Insert Data Into Temp Table From Different Databases
我正在尝试将来自 2 个不同数据库的 2 table 的数据插入临时 table。这是因为我需要一个数据在另一个中创建一个唯一标识符。
这是我目前拥有的:
-- 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
但是这个查询 returns 是这样的:
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,并根据已经存储在临时 table 中的初始 ChildValue 更新 DB1 中的令牌 table ].
例如松散地写成:
UPDATE DB1.Notice
SET ChildValue = NewChildValue
WHERE ChildValue = #Staging.ChildValue
(我知道这不是正确的语法,我只是 shorthand 写的)
不幸的是,数据库之间没有 link,这就是我尝试这样做的原因。
如有任何想法或建议,我们将不胜感激。
您可以使用 row_number()
生成序列号并使用它来连接 Token
和 Notice
的行
linkChildValue
和Table_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
我正在尝试将来自 2 个不同数据库的 2 table 的数据插入临时 table。这是因为我需要一个数据在另一个中创建一个唯一标识符。
这是我目前拥有的:
-- 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
但是这个查询 returns 是这样的:
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,并根据已经存储在临时 table 中的初始 ChildValue 更新 DB1 中的令牌 table ].
例如松散地写成:
UPDATE DB1.Notice
SET ChildValue = NewChildValue
WHERE ChildValue = #Staging.ChildValue
(我知道这不是正确的语法,我只是 shorthand 写的)
不幸的是,数据库之间没有 link,这就是我尝试这样做的原因。
如有任何想法或建议,我们将不胜感激。
您可以使用 row_number()
生成序列号并使用它来连接 Token
和 Notice
linkChildValue
和Table_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