2014-01-08 4 views
1

반 정기적으로 삽입해야하는 새 테이블을 만들었습니다. 정규화로 인해 필자는 자신과 EU의 보고서를보다 논리적으로 만들기 위해 기본 테이블 위에 뷰를 작성하기로 결정했습니다. 스토어드 프로 시저를 사용하여 삽입을 다른 뷰를 통해 기본 테이블로 밀어 넣으려고 시도하는 것이 좋습니다. SSMS에서 INSERT 문을 성공적으로 실행할 수 있지만 내 삽입이 함수라고 생각하기 때문에 저장 프로 시저로 작성하려고하면 실행됩니다. 여기 보기에 삽입 할 저장 프로 시저 만들기

오류입니다 : 내가 구글에 내 청원을 부어했지만 좋은 해결책을 발견하지 않았습니다

CREATE PROCEDURE jedi.p_ForcePush 
    @Field varchar(25) = NULL, 
    @Value varchar(250) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    insert jedi.v_midichlorians (@field) values (@value) 
END 
GO 

:

Msg 215, Level 16, State 1, Procedure jedi.p_ForcePush, Line 12 
Parameters supplied for object 'jedi.v_midichlorians' which is not a function. If the parameters are intended as a table hint, a WITH keyword is required. 

가 여기 내 스크립트입니다. 내 구문에 많은 다른 콤보 시도했지만 아무것도.

도움을 주시면 감사하겠습니다. (PS-SQL 2012)

답변

0
CREATE PROCEDURE jedi.p_ForcePush 
    @Field varchar(25) = NULL, 
    @Value varchar(250) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql NVARCHAR(MAX); 

SET @sql = N'INSERT INTO jedi.v_midichlorians (' + QUOTENAME(@field) 
      + N') values (@value)' 

    EXECUTE sp_executesql @sql 
         , N'@Value varchar(250)' 
         , @Value 
END 
GO 

매개 변수는 SQL 서버가 QUOTENAME()를 사용하여 문자열이 아닌 객체 이름으로 처리하는 것이 명시 적으로 SQL 서버를 말하는 [] 대괄호로 전달 된 열 이름을 랩으로 당신은 @field의 PARAM을 전달하는 경우 그것은 객체 (테이블, 컬럼) 이름입니다.

추가 정보보기에 하나의 기본 테이블 만있는 경우보기를 사용하여 다른 값을 삽입하려면 테이블 이름을 사용하십시오.

뷰의 정의에 하나 이상의 기본 테이블이 있고 뷰를 사용하여 데이터를 삽입하려는 경우 Instead of triggers을 만들어야합니다.

가장 좋은 옵션은 모든 삽입 작업을 수행하고 테이블에 직접 삭제 작업을 업데이트하고 뷰를 사용하지 않도록 한 다음 하나 이상의 기본 테이블을 기반으로 뷰를 트리거하는 것입니다.

+0

완벽하게 작동했습니다! 많이 감사 ... 그리고 뭔가 새로운 것을 배웠습니다 – JellyBellyJedi

0

삽입 stmts가 ssMS에서 제대로 실행된다고 언급 했는데도 SSMS에서 실행 한 것과 동일한 insert stmt를 확인할 수 있습니까? becaus ethere는이 stmt에서 오류입니다.

"삽입 jedi.v_midichlorians (@field)"

syntex는 inccoect이며, 바로 "@"열 이름이 dnot해야합니까?

이보기는 단일 테이블을 기반으로합니까?

+0

보기는 여러 테이블을 기반으로합니다. 테이블은 정규화되어 있고 뷰를 통해 모든 관련 정보를 더 쉽게 볼 수 있습니다. 또한 모든 열 이름이 한 위치에 있으므로 삽입 프로세스를 단순화해야합니다. – JellyBellyJedi

+0

필드 및 값에 대한 입력 매개 변수를 제공하는 저장 프로 시저를 가져 오려고합니다. 변수는 내가 생각했던 varchar가 올바르게 구문 분석 될 수 있지만 어쩌면 문자열을 표기하기 위해 따옴표를 포함해야합니까? – JellyBellyJedi

+0

Ali가 언급했듯이,보기가 여러 테이블을 기반으로하고 여러 테이블을 기반으로하는 경우보기를 통해 삽입을 수행 할 수 없습니다. 보기가 좋습니다. 복잡한 조인으로 선택하고 안에 포함 할 수있는 모든 필터를 사용하면 선택한 쿼리가 간단하게 유지됩니다. 어쨌든 Ali가 설명했듯이 동적 SQL에 직접 테이블 이름을 사용해야합니다. –