Вставка строки в таблицу с использованием значений результатов запроса из другой таблицы - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть хранимая процедура:

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 ]

4 голосов
/ 21 ноября 2011
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 )

Затем вставьте этот новый параметр в оператор вставки.

3 голосов
/ 21 ноября 2011
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 голосов
/ 21 ноября 2011

Предполагается одна строка из каждого 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

Соединение изменяется в зависимости от того, что вы ожидаете, например FULL OUTER JOIN .. ON 1=1

Если какой-либо запрос возвращает более 1 строки, то:

  • внутренний подзапрос завершается неудачно
  • вставка не имеет смысла: что вставлять с 4 строками и 3 строками?
1 голос
/ 21 ноября 2011

Это может быть выполнено различными способами, как показано ниже, в обоих случаях я думаю, что мы должны рассмотреть что-то, что, если возвращаемые данные могут быть более одного.

а.

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) данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...