让我们说我有一张桌子(一切都非常简化):
create table OriginalData (
ItemName NVARCHAR(255) not null
)
我想将其数据(基于集合!)插入到两个模型继承表
中create table Statements (
Id int IDENTITY NOT NULL,
ProposalDateTime DATETIME null
)
create table Items (
StatementFk INT not null,
ItemName NVARCHAR(255) null,
primary key (StatementFk)
)
语句是父表,Items是子表。我用一行涉及使用IDENT_CURRENT我没有问题,但我不知道如何根据这一组进行设置(即在两个表中输入几行)。
感谢。
祝福,
基督教
答案 0 :(得分:1)
另一种可能阻止使用游标的方法(通常不是SQL的最佳实践)如下所示...它使用OUTPUT子句捕获插入中使用的一个表的插入结果到第二个表。
请注意,此示例假设我将IDENTITY列移动到Items表。我相信这是可以接受的,至少基于你原来的表格布局,因为该表的主键是StatementFK列。
请注意,此示例代码是通过SQL 2005测试的......
IF OBJECT_ID('tempdb..#OriginalData') IS NOT NULL
DROP TABLE #OriginalData
IF OBJECT_ID('tempdb..#Statements') IS NOT NULL
DROP TABLE #Statements
IF OBJECT_ID('tempdb..#Items') IS NOT NULL
DROP TABLE #Items
create table #OriginalData
( ItemName NVARCHAR(255) not null )
create table #Statements
( Id int NOT NULL,
ProposalDateTime DATETIME null )
create table #Items
( StatementFk INT IDENTITY not null,
ItemName NVARCHAR(255) null,
primary key (StatementFk) )
INSERT INTO #OriginalData
( ItemName )
SELECT 'Shirt'
UNION ALL SELECT 'Pants'
UNION ALL SELECT 'Socks'
UNION ALL SELECT 'Shoes'
UNION ALL SELECT 'Hat'
DECLARE @myTableVar table
( StatementFk int,
ItemName nvarchar(255) )
INSERT INTO #Items
( ItemName )
OUTPUT INSERTED.StatementFk, INSERTED.ItemName
INTO @myTableVar
SELECT ItemName
FROM #OriginalData
INSERT INTO #Statements
( ID, ProposalDateTime )
SELECT
StatementFK, getdate()
FROM @myTableVar
答案 1 :(得分:0)
您需要编写一个ETL过程来执行此操作。您可能想要研究SSIS。
这也可以使用t-sql和可能的临时表来完成。您可能需要在Statements表中存储来自OriginalTable的唯一键,然后在插入Items时 - 将OriginalTable与该唯一键上的Statements连接以获取ID。
答案 2 :(得分:0)
我不认为你可以在一个块中做到这一点,但你当然可以使用游标循环
DECLARE @bla char(10)
DECLARE @ID int
DECLARE c1 CURSOR
FOR
SELECT bla
FROM OriginalData
OPEN c1
FETCH NEXT FROM c1
INTO @bla
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO Statements(ProposalDateTime) VALUES('SomeDate')
SET @ID = SCOPE_IDENTITY()
INSERT INTO Items(StateMentFK,ItemNAme) VALUES(@ID,@bla)
FETCH NEXT FROM c1
INTO @bla
END
CLOSE c1
DEALLOCATE c1