使用另一个表中的查询结果值将行插入表中

时间:2011-11-21 15:57:36

标签: sql sql-server tsql stored-procedures

我有一个存储过程:

CREATE PROCEDURE MyProc
(
    @Param1  [datetime],
    @Param2  [nvarchar](20),
    @Param3  [nvarchar](20),
    @Param4  [nvarchar](20),
    @Param5  [nvarchar](20),
)
AS
BEGIN   
INSERT INTO MyTable1
  (
    Field1,
    Field2,
    Field3,
    Field4,
    Field5
  )   
 SELECT         
    @Param1,
    @Param2,
    @Param3,
    Field12,
    'constantValue'         
FROM   MyTable2
WHERE  Field13 = @Param4
END

我如何更改存储过程,以便它插入Field5 MyTable1而不是constantValue,而是另一个查询到MyTable2的结果参数(@Param5)?
即:

FROM   MyTable2
WHERE  Field13 = @Param5

4 个答案:

答案 0 :(得分:4)

INSERT INTO MyTable1
(
  Field1,
  Field2,
  Field3,
  Field4,
  Field5
)   
SELECT         
    @Param1,
    @Param2,
    @Param3,
    Field12,
    (
         select field_name from MyTable2 where Field13 = @Param5
    )
FROM   
    MyTable2
WHERE 
    Field13 = @Param4
END

或声明一个新变量:

SET @newparam = (SELECT field_name FROM MyTable2 WHERE Field13 = @Param5 )

然后将此新参数插入到insert语句中。

答案 1 :(得分:3)

CREATE PROCEDURE MyProc
(
    @Param1  [datetime],
    @Param2  [nvarchar](20),
    @Param3  [nvarchar](20),
    @Param4  [nvarchar](20),
    @Param5  [nvarchar](20),
)
AS
BEGIN   
INSERT INTO MyTable1
  (
    Field1,
    Field2,
    Field3,
    Field4,
    Field5
  )   
 SELECT         
    @Param1,
    @Param2,
    @Param3,
    Field12,
    (SELECT thing_i_care_about FROM MyTable2 WHERE Field13 = @Param5)
FROM   MyTable2
WHERE  Field13 = @Param4
END

答案 2 :(得分:2)

假设每个SELECT

中有一行
SELECT         
    @Param1, @Param2, @Param3, Tp4.Field12, Tp5.Field12
    NULL        
FROM
   MyTable2 Tp4
   CROSS JOIN
   MyTable2 Tp5
WHERE
   Tp4.Field13 = @Param4 AND Tp4.Field13 = @Param5

JOIN会根据您的期望而变化,例如FULL OUTER JOIN .. ON 1=1

如果任一查询返回多于1行,则:

  • 内联子查询失败
  • 插入没有意义:插入4行3行的内容?

答案 3 :(得分:1)

它可以通过以下不同的方式完成,在这两种情况下,我认为我们应该考虑一个事情,如果返回的数据可能不止一个。

一个。

INSERT INTO MyTable1
(
 Field1,
 Field2,
 Field3,
 Field4,
 Field5
)   

SELECT         
 @Param1,
 @Param2,
 @Param3,
 Field12,
  (SELECT TOP 1 Column_Name FROM MyTable2 WHERE Field13 = @Param5)
FROM   MyTable2
WHERE  Field13 = @Param4

DECLARE @Field13 VARCHAR(20)
SELECT TOP 1 @Field13  = FROM MyTable2 WHERE Field13 = @Param5

INSERT INTO MyTable1
(
 Field1,
 Field2,
 Field3,
 Field4,
 Field5
)   

SELECT         
 @Param1,
 @Param2,
 @Param3,
 Field12,
 @Field13
FROM   MyTable2
WHERE  Field13 = @Param4

在任何一种情况下都会成功,但“Field13 = @ Param5”条件可能会显示多个数据但会对第一个(TOP 1)数据起作用。