在SQL Server 2008中使用SELECT语句插入表并添加额外的列

15

我正在尝试从一个选择语句中向表中插入数据,并像下面这样添加额外的参数到行中:

SELECT 
        Appt_ID,
        Pracitioner_ID,
        Appt_Book_ID,
        Start_Time,
        UR_NO,
        [Type],
       [Description]
FROM @TempWaiting,
 @EndTime,
 @PatientID, 
 @Title, 
 @FirstName, 
 @LastName, 
 @Surname, 
 @DOB
INTO PS_WAITING_LIST(Appt_ID,   
        Pracitioner_ID,
        Appt_Book_ID,
        Start_Time,
        UR_NO,
        [Type],
        [Description],
        End_Time,
        Patient_ID, 
        Title,
        First_Name,
        Middle_Name,
        Surname,
        DOB)

这段代码在存储过程中,执行后只显示INTO之后的错误信息。

我也尝试将其重写为 -

insert into PS_WAITING_LIST (
        Appt_ID,    
        Pracitioner_ID,
        Appt_Book_ID,
        Start_Time,
        UR_NO,
        [Type],
        [Description],
        End_Time,
        Patient_ID, 
        Title,
        First_Name,
        Middle_Name,
        Surname,
        DOB)
SELECT 
        Appt_ID,
        Pracitioner_ID,
        Appt_Book_ID,
        Start_Time,
        UR_NO,
        [Type],
        [Description]
FROM @TempWaiting,
 @EndTime,
 @PatientID, 
 @Title, 
 @FirstName, 
 @LastName, 
 @Surname, 
 @DOB

这会引发一个错误,提示选择值的数量必须与插入列的数量相匹配。显然事实并非如此。

我还尝试了Insert into table (col1, col2..) Select * from (select (...), col3, col9)

6个回答

24

通常它的工作原理是这样的

insert into your_table (col1, col2, col3)
select some_column, @aVariable, 'static_string'
from another_table

即使 @aVariable 不属于 another_table,也是可以的吗? - user2537701
变量从不属于表格。 - juergen d

3

如果您有一张列数很多的表格,将它们全部列出来可能会很繁琐。例如,要在末尾添加一个记录时间戳(loggedAT)或重新创建时间戳(recreatedAt),可以执行以下操作。首先,在最后一列创建一个dts列,然后

INSERT INTO users_log SELECT *, NOW() FROM users WHERE id=?;

在这种情况下,我们现在知道了列何时被添加到我们的users_log表中。最后一个情况是,我们可能还想要一个特定于users_log表的主键。让我们再次修改users_log表,通过在表的末尾添加一个“key”列并将其设置为PK、AUTO、UNSIGNED来实现。现在,我们可以使用以下内容填充该ID:
INSERT INTO users_log SELECT *, NOW(), '' FROM users WHERE id=?;

现在我们有了用户记录的精确副本,包括来自用户表的主键,在我们的users_log表中,我们现在可以跟踪记录何时被复制并生成它自己的主键。请注意,为了避免id冲突,需要修改users_log表以删除从users表获取的id的主键。


2
假设@tempWaiting是一个变量表,语句应该像这样。
    insert into PS_WAITING_LIST (
    Appt_ID,    
    Pracitioner_ID,
    Appt_Book_ID,
    Start_Time,
    UR_NO,
    [Type],
    [Description],
    End_Time,
    Patient_ID, 
    Title,
    First_Name,
    Middle_Name,
    Surname,
    DOB)
SELECT 
    Appt_ID,
    Pracitioner_ID,
    Appt_Book_ID,
    Start_Time,
    UR_NO,
    [Type],
    [Description],
    @EndTime,
    @PatientID, 
    @Title, 
    @FirstName, 
    @LastName, 
    @Surname, 
    @DOB
FROM @TempWaiting

是的,有效。+1 但是Juergen先指出了,所以我会接受他的。 - user2537701
没问题,我只是想帮忙:D - Raphael

0

我有两个表,表格firstsecond

  • 第一个表包含产品和价格
  • 第二个表有月份列和总计列

我想要更新第二个表格,使其包含第一个表格中产品的总和加上月份。

我发现这个查询很有用,我认为你可以尝试一下来解决你的问题。

INSERT INTO second (month, total) SELECT 'JANUARY' SUM(PRICE) AS TOTAL FROM first

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
在我的特定情况下,两个表中的id字段都是自动递增的,因此当我将这些表合并在一起时,其中一个表内部会抛出错误,因为某些id匹配。
要纠正这个问题,您必须调用“nextval”函数(我正在使用postgres)。完整的语法如下: insert into your_table select nextval('your_table_id_seq') AS id, column_1, column_2, column_3, 'static_string' AS column_name from another_table.

0

您也可以尝试以下方法:

Insert Into CustomerNew (CustomerId, CustomerName) 
  SELECT CustID, Name
  FROM CustomerOld WHERE CustomerId Is not Null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接