2017-12-13 21 views
1

완전한 Newb는 배우려고합니다.쉼표로 SQL 구문 오류

"OrderDate"가 업데이트/입력되었을 때 "Sales"테이블에 "Sales"테이블을 채우고 싶지만 여러 열을 삽입하는 데 문제가 있습니다.

CREATE TRIGGER SalesOrderDateTrigger 
    ON [dbo].[Sales] 
    AFTER INSERT 
    AS 
    BEGIN 
    SET NOCOUNT ON; 

    DECLARE @OrderDate Date 

    SELECT @OrderDate = INSERTED.OrderDate FROM INSERTED 

    IF @OrderDate > 0 
    BEGIN 

    INSERT INTO Finance 
    (Quote, Customer, Project_Name, [Value], 
    POC_Name_#1, POC_Number_#1, POC_Email_#1, 
    POC_Name_#2, POC_Number_#2, POC_Email_#2, 
    Comment, [DA Link]) 
    SELECT (INSERTED.Quote, INSERTED.Customer, INSERTED.Project_Name, 
    INSERTED.[Value], 
    INSERTED.POC_Name_#1, INSERTED.POC_Number_#1, INSERTED.POC_Email_#1, 
    INSERTED.POC_Name_#2, INSERTED.POC_Number_#2, INSERTED.POC_Email_#2, 
    INSERTED.Comment, INSERTED.[DA Link]) 
    FROM INSERTED 

    END 


END 

고맙습니다. 당신의 접근 방식에 몇 가지 문제가 있습니다

+1

떨어져 기반 VIEW이 될 수 ?? ????????????? 그것은 질문 할 때 가장 중요한 정보입니다. – Eric

+0

당신은'SELECT'에서()를 사용할 필요가 없습니다. – indiri

+0

SELECT @OrderDate = min (OrderDate) FROM을 삽입하고 싶었거나'WHERE OrderDate> 0 '을 (를) 추가하려면'SELECT x, y, z'가 아닌 SELECT 'INSERT' 자체. – shawnt00

답변

0

..

당신은 항상 방식의 "블록 데이터의"종류이보고 아닙니다. 물론 한 번에 하나의 행만 삽입 할 수 있지만 동시에 여러 행을 동시에 테이블에 삽입 할 수 있습니다. 이 경우, inserted pseudotable에는 둘 이상의 행이 있으므로 하나의 주문 날짜를 하나의 변수 @orderdate로 선택할 수 없습니다. sqlserver 트리거를 사용하여 "행 단위"로 생각하지 마십시오. sqlserver 서버 측 프로그래밍의 설계 의도는 항상 기본으로 설정된다는 것입니다. 방아쇠를 쓰는 무엇이든, 0에서 수백만 개의 행을 한 번에 한 행씩 처리해야합니다.

나는 0과 날짜를 비교하는 행이 무엇인지를 잘 모릅니다.

Order 테이블에있는 데이터를 효과적으로 Finance 테이블에 삽입하는 삽입을 실행합니다. 새롭거나 다른 데이터가 계산되거나 다른 곳에서 가져 오지 않아 주문과 금융이 동일한 데이터를 가지고 많은 수의 열을 공유한다고 생각하게됩니다. 데이터베이스 디자인면에서 보면 이는 정상적인 정규화 전략이 아닙니다. 재무 테이블이 주문 테이블을 복제하면 아마 존재하지 않아야합니다. 비즈니스 로직이 아닌 널 주문일과 주문 테이블의 항목이, 금융 테이블에 항목을 깨닫는다 경우 실제로 정말 금융은 실제로 단지 간단한 쿼리 DBMS

SELECT blahblah FROM orders WHERE orderdate IS NOT NULL 
+0

다른 견해 ... 당신은 깨어 난 망치로 나를 때렸다. 가장 좋은 비트는 실제로 그것을 쓰는 법을 알고 있습니다. Tbh 나는 너 같은 사람이 와서 다른 접근법으로 나를 때리는 것을 기대하고 있었다. – NewbieMcNewbface