SQL Server存储过程 - 插入新行

时间:2014-08-07 04:09:27

标签: sql sql-server stored-procedures

我想在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

我不明白我哪里出错了?

2 个答案:

答案 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的最佳用途。

相关问题