我想在Table2
中插入Table1
中的记录,并且插入我指定的新主键..我已经编写了以下存储过程::
DECLARE @Iterator INT, @tempCount INT, @Nbb_ID INT
SET @Iterator = 0
SET @tempCount = count('SELECT * FROM Table1')
WHILE (@Iterator < @tempCount)
BEGIN
SET @Nbb_ID = NEWID()
INSERT INTO Table2 (Nbb_ID, Nbb_Name)
VALUES (@Nbb_ID, (SELECT NAME1 FROM Table1 WHERE rownum = @Iterator + 1))
SET @Iterator = @Iterator + 1
END
我不明白我哪里出错了?
答案 0 :(得分:1)
INSERT
命令有两种形式:
(1)您可以使用所有值,如文字或SQL Server变量 - 在这种情况下,您可以使用INSERT .. VALUES()
方法:
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
注意:我建议始终明确指定要插入数据的列列表 - 这样,如果您的表突然有一个额外的列,或者如果突然您的表有额外的列,您将不会有任何令人讨厌的意外您的表具有IDENTITY
或计算列。是的 - 这是一个更多的工作 - 一次 - 但是你的INSERT
陈述尽可能坚实,如果你的桌子你不必经常摆弄它变化。
(2)如果您不将所有值都作为文字和/或变量,而是您想要依赖另一个表,多个表或视图,提供值,然后您可以使用INSERT ... SELECT ...
方法:
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
SELECT
SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
FROM
dbo.YourProvidingTableOrView
在这里,您必须在SELECT
中定义与INSERT
所期望的完全相同的项目 - 这些项目可以是表格(或视图)中的列,或者那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。
您可以使用其中一个 - 但无法混合两者 - 您无法使用VALUES(...)
然后进行SELECT
查询在你的价值列表中间 - 选择其中一个 - 坚持下去。
因此,在您的情况下,您需要将INSERT
语句更改为:
INSERT INTO Table2 (Nbb_ID, Nbb_Name)
SELECT
NEWID(), NAME1
FROM
Table1
并且应该这样做 - 完全没有必要在这里创建你自己的 row-by-agonizing-row WHILE
循环....只需使用一个,基于集合的声明,你已经完成了!
答案 1 :(得分:1)
我不完全确定您要尝试实现的目标,但如果您只是想将Table1中的记录复制到Table2中,但是为Table2记录提供了新ID,那么您可以通过使用
更有效地做到这一点insert into Table2
select NEWID(), NAME1 from Table1
这将评估从Table1获取的每条记录的NEWID(),从而为Table2记录提供不同的UID。
这种方法的好处在于,这是一种基于集合的方法,这是DB最擅长的方法。你的方法是RBAR(逐行 - 痛苦行),这不是SQL的最佳用途。