2010-07-12 10 views
0

Хорошо, поэтому у меня есть эта проблема с моей таблицей фактов. Мне нужно, чтобы он автоматически заполнялся, когда новые данные вводились во всех других таблицах в базе данных, которая имеет внешний ключ в моей таблице фактов. В моей хранимой процедуре, я свел все операторы вставки у меня есть, и в конце, так как я хочу, чтобы обновить таблицу фактов, я размещаю этот запрос:SQL Server Вставить запрос в таблицу фактов

INSERT INTO Fact (AccountID, ExpenseID, DateTimeID, InventoryID) 
VALUES (@AccountID, 
     (SELECT ExpenseID FROM Expenses WHERE WaterBill = @WaterBill AND ElectricBill = @ElectricBill AND OfficeRent = @OfficeRent, 
     SELECT DateTimeID FROM DateTime WHERE MonthNo = @MonthNo AND Date = @Date AND Year = @Year AND Time = @Time AND Day = @Day AND DayNo = @DayNo, 
     SELECT InventoryID FROM Inventory WHERE ProductInID = @ProductInID AND ProductOutID = @ProductOutID) 

Однако я получаю сообщение об ошибке со следующим сообщением :

Subqueries are not allowed in this context. Only scalar expressions are allowed. 

Может кто-нибудь мне помочь? Большое спасибо. :)

МОЙ ПОЛНЫЙ ПОРЯДОК:

ALTER PROCEDURE [dbo].[ExpenseListInsert] 
    @AccountID char(6), 
    @ExpenseID int, 
    @DateTimeID int, 
    @InventoryID int, 
    @WaterBill decimal(19, 4), 
    @ElectricBill decimal(19, 4), 
    @OfficeRent decimal(19, 4), 
    @Miscellaneous decimal(19, 4), 
    @ProductsExpense decimal(19, 4), 
    @Subtotal decimal(19, 4), 
    @ProductInID int, 
    @ProductOutID int, 
    @Product30001 int, 
    @Product30002 int, 
    @Product30003 int, 
    @MonthNo int, 
    @Date int, 
    @Year int, 
    @Time char(11), 
    @Day char(10), 
    @DayNo int 
AS 
    INSERT INTO Expenses (WaterBill, ElectricBill, OfficeRent, Miscellaneous, ProductsExpense, Subtotal) 
    VALUES(@WaterBill, @ElectricBill, @OfficeRent, @Miscellaneous, @ProductsExpense, @Subtotal) 

    INSERT INTO ProductIn (ProductInID, Product30001, Product30002, Product30003) 
    VALUES(@ProductInID, @Product30001, @Product30002, @Product30003) 

    INSERT INTO ProductOut (ProductOutID, Product30001, Product30002, Product30003) 
    VALUES(@ProductOutID, '0', '0', '0') 

    INSERT INTO Inventory (ProductInID, ProductOutID) 
    VALUES (@ProductInID, @ProductOutID) 

    INSERT INTO DateTime (MonthNo, Date, Year, Time, Day, DayNo) 
    VALUES (@MonthNo, @Date, @Year, @Time, @Day, @DayNo) 

    SELECT @ExpenseID = ExpenseID FROM Expenses WHERE WaterBill = @WaterBill AND ElectricBill = @ElectricBill AND OfficeRent = @OfficeRent 

    SELECT @DateTimeID = DateTimeID FROM DateTime WHERE MonthNo = @MonthNo AND Date = @Date AND Year = @Year AND Time = @Time AND Day = @Day AND DayNo = @DayNo 

    SELECT @InventoryID = InventoryID FROM Inventory WHERE ProductInID = @ProductInID AND ProductOutID = @ProductOutID 

    INSERT INTO Fact (AccountID, ExpenseID, DateTimeID, InventoryID) 
    VALUES (@AccountID, @ExpenseID, @DateTimeID, @InventoryID) 
RETURN 

ответ

0

Предполагая, что подзапросы каждый может возвращать только одну запись, это должно работать

DECLARE @ExpenseID int, @DateTimeID int, @InventoryID int 


SELECT @ExpenseID= ExpenseID FROM Expenses WHERE WaterBill = @WaterBill AND ElectricBill = @ElectricBill AND OfficeRent = @OfficeRent 

SELECT @DateTimeID = DateTimeID FROM DateTime WHERE MonthNo = @MonthNo AND Date = @Date AND Year = @Year AND Time = @Time AND Day = @Day AND DayNo = @DayNo 

SELECT @InventoryID = InventoryID FROM Inventory WHERE ProductInID = @ProductInID AND ProductOutID = @ProductOutID 

INSERT INTO Fact (AccountID, ExpenseID, DateTimeID, InventoryID) 
VALUES (@AccountID, @ExpenseID, @DateTimeID, @InventoryID) 
+0

сэр, спасибо за это. Но я попытался запустить эту хранимую процедуру. Но каждый раз, когда я запускаю свое приложение, это дает мне ошибку, говоря, что моя процедура ожидает параметр @ExpenseID, который не был предоставлен. Теперь я отредактирую свой вопрос, чтобы поместить мою хранимую процедуру. Благодарю. – Smiley

+0

спасибо. Я получил его сейчас! – Smiley

0

Измените запрос таким:

INSERT INTO Fact (AccountID, ExpenseID, DateTimeID, InventoryID) 
SELECT @AccountID, 
    (SELECT ExpenseID FROM Expenses WHERE WaterBill = @WaterBill AND ElectricBill = @ElectricBill AND OfficeRent = @OfficeRent), 
    (SELECT DateTimeID FROM DateTime WHERE MonthNo = @MonthNo AND Date = @Date AND Year = @Year AND Time = @Time AND Day = @Day AND DayNo = @DayNo), 
    (SELECT InventoryID FROM Inventory WHERE ProductInID = @ProductInID AND ProductOutID = @ProductOutID) 
+0

этот запрос дает мне следующее сообщение об ошибке: Msg 102, Level 15, State 1, Procedure ExpenseListInsert, строка 38 Неправильный синтаксис около ''. Msg 102, уровень 15, состояние 1, процедура ExpenseListInsert, строка 39 Неверный синтаксис рядом с ','. – Smiley

+0

@ Ким Ривера - исправлено. Я думал, что вы заключили в скобки каждый «SELECT» – cjk

0

Вы не можете делать подзапросы с ванильным INSERT, вам нужно сделать INSERT ... SELECT:

INSERT INTO [Fact] (AccountID, ExpenseID, DateTimeID, InventoryID) 
SELECT @AccountID, 
     (SELECT ExpenseID FROM [Expenses] WHERE WaterBill = @WaterBill AND ElectricBill = @ElectricBill AND OfficeRent = @OfficeRent), 
     (SELECT DateTimeID FROM [DateTime] WHERE MonthNo = @MonthNo AND [Date] = @Date AND [Year] = @Year AND [Time] = @Time AND [Day] = @Day AND DayNo = @DayNo), 
     (SELECT InventoryID FROM Inventory WHERE ProductInID = @ProductInID AND ProductOutID = @ProductOutID) 

Я бы также посмотреть на план выполнения для этого возможные горлышка производительности, а также посмотреть на индексы на счет, DateTime и таблицы Inventory.

+0

Я не понимаю, что делает этот запрос. не могли бы вы объяснить мне? Благодарю. :) – Smiley

+0

Когда вы используете VALUES с INSERT, вам необходимо передать значения SCALAR. Когда вы используете SELECT с INSERT, вы можете передать табличный результирующий набор, в этом случае результаты ваших трех подзапросов. –

+0

Это может показаться глупым, но я все равно не понимаю. Что я действительно хотел бы сделать, так это: INSERT INTO Факт (A, B, C, D) ЦЕННОСТИ (A, B должен быть из другой таблицы, C должен поступать из другой таблицы, D должен поступать из другой таблицы) Является ли этот SELECT INSERT применимым к этой ситуации? Большое спасибо. – Smiley