Вставка двух строк, которые почти идентичны друг другу


Я пытаюсь сделать тестовые данные для приложения я пишу, и некоторые из моих тестовых данных очень однообразная, с участием вставка строки, а затем вставить другую строку, которая совпадает за исключением одного столбца. Как таковой, у меня очень повторяющихся инструкций Insert, сделать больше файл, чем я думаю, он должен быть.

INSERT INTO [dbo].[InvoiceItem] (invoice_item_name, amount, invoice_id) VALUES
  ('TUITION',
    (SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id = 
      (SELECT grade_id FROM [dbo].[Student] WHERE first_name = 'Murdoch')),
    (SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
      (SELECT student_id FROM [dbo].[Student] WHERE first_name = 'Murdoch' AND invoice_date = '2019-09-05'))),
  ('TUITION_SERVICE_FEE',
    (SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id = 
      (SELECT grade_id FROM [dbo].[Student] WHERE first_name = 'Murdoch')) * 0.03,
    (SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
      (SELECT student_id FROM [dbo].[Student] WHERE first_name = 'Murdoch' AND invoice_date = '2019-09-05'))),
  ('TUITION',
    (SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id = 
      (SELECT grade_id FROM [dbo].[Student] WHERE first_name = 'Hartwell')),
    (SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
      (SELECT student_id FROM [dbo].[Student] WHERE first_name = 'Hartwell' AND invoice_date = '2019-09-05'))),
  ('TUITION_SERVICE_FEE',
    (SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id = 
      (SELECT grade_id FROM [dbo].[Student] WHERE first_name = 'Hartwell')) * 0.03,
    (SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
      (SELECT student_id FROM [dbo].[Student] WHERE first_name = 'Hartwell' AND invoice_date = '2019-09-05'))),

Есть ли способ, чтобы убрать случайно?



112
4
задан 5 апреля 2018 в 06:04 Источник Поделиться
Комментарии
2 ответа

Вы должны создать хранимую процедуру, которая делает это с параметр @firstname

это вышло бы куда грязнее.

вот что создавать будет выглядеть, я добавил в @InvoiceDate параметров, а также думая, что это было также то, что не является статичной в инструкции Insert.

CREATE PROCEDURE Sproc_Name   
@FirstName nvarchar(50)
,@InvoiceDate DateTime
AS
INSERT INTO [dbo].[InvoiceItem] (invoice_item_name, amount, invoice_id) VALUES
('TUITION',
(SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id =
(SELECT grade_id FROM [dbo].[Student] WHERE first_name = @FirstName)),
(SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
(SELECT student_id FROM [dbo].[Student] WHERE first_name = @FirstName AND invoice_date = @InvoiceDate))),
('TUITION_SERVICE_FEE',
(SELECT tuition_amount FROM [dbo].[Grade] WHERE grade_id =
(SELECT grade_id FROM [dbo].[Student] WHERE first_name = @FirstName)) * 0.03,
(SELECT invoice_id FROM [dbo].[Invoice] WHERE student_id =
(SELECT student_id FROM [dbo].[Student] WHERE first_name = @FirstName AND invoice_date = @InvoiceDate)))
GO

и тогда вы могли бы назвать его, как это

EXECUTE Sproc_Name @FirstName = "Murdoch", @InvoiceDate = CONVERT(date, GETDATE())
-- CONVERT(date, GETDATE()) gives you 2018-04-05

Я просто использовал GetDate() для наглядности можно поместить в строку "2018-04-05" и он должен работать так же.

2
ответ дан 5 апреля 2018 в 06:04 Источник Поделиться

Вы пытаетесь вставить все предметы счета для всех студентов с датой счета-фактуры '2019-09-05'? Если вы используете один запрос для получения всех студентов, вы заинтересованы в создании элементов счета-фактуры, то в итоге у вас будет две инструкции Insert. Одно ниже, то похожее на 'Tuition_Service_Fee'. Кроме того, используя соединения таблицы вместо вложенных запросов является предпочтительным, на мой взгляд - более удобочитаемым и может улучшить производительность. Но, безусловно, использовать переменные вместо жестко заданных значений позволит кода для повторного использования если вы просто вызвать скрипт или создать хранимую процедуру.

declare @invoiceDtm datetime

INSERT INTO [dbo].[InvoiceItem] (invoice_item_name, amount, invoice_id)
select "Tuition", Grade.tuition_amount, invoice.invoice_id
from Student
join invoice on student.student_id = invoice.student_id
join grade on student.grade_id = grade.grade_id
where student.invoice_date = @invoiceDtm
--if you really want to specifiy the first names
and student.first_name in ('Murdoch', 'Hartwell')

0
ответ дан 5 апреля 2018 в 06:04 Источник Поделиться