2017-12-27 56 views
0

필요한 경우 INSERT/UPDATE하는 저장 프로 시저를 만들었습니다. 난 내가 삽입 여부를해야하는 경우 평가하기 위해이 방법을 사용하고 있습니다 :INSERT 값으로 SELECT 변수를 사용하는 열 이름이 일치하지 않습니다.

INSERT INTO X 
SELECT @A, @B, @C -- Exactly as the table, all nullables 
WHERE NOT EXISTS (SELECT * from ... WHERE condition) 

을하지만 난

메시지 213, 수준 16, 상태 1, 프로 시저 ArtigoEAN_Remover, 라인 (48) [일괄 시작을 수신하고 Line 7] 제공된 값의 열 이름이나 개수가 테이블 정의와 일치하지 않습니다. 그래서

@ArtigoID AS varchar(14), 
@TipoArtigo AS varchar(3), 
@CodBarras AS varchar(24) 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
SET NOCOUNT ON; 

    IF (@ArtigoID IS NOT NULL AND @TipoArtigo IS NULL) OR (@ArtigoID IS NULL AND @TipoArtigo IS NOT NULL) 
    BEGIN 
     PRINT 'Tem que escolher ArtigoID & TipoArtigo para remover código EAN da referência.' 
     RETURN 
    END 
    -- 
    IF (@CodBarras IS NOT NULL) AND (@ArtigoID IS NOT NULL OR @TipoArtigo IS NOT NULL) 
    BEGIN 
     PRINT 'Escolher Código EAN apenas (Para remover esse código de barras de todas as referências) OU ArtigoID + TipoArtigo (remover todos os códigos EAN associados a essa referência)' 
     RETURN 
    END 
    -- 
    IF @ArtigoID IS NOT NULL AND @TipoArtigo IS NOT NULL 
    BEGIN 

    UPDATE [s].[dbo].[FArtigo] 
    SET CodBarras = '' 
    WHERE ArtigoID = @ArtigoID AND TipoArtigo = @TipoArtigo AND CodBarras = @CodBarras 
    -- LINE 48 
    INSERT INTO [s].[dbo].[Infolog_ArtigoEAN] 
    SELECT @ArtigoID,@TipoArtigo,@CodBarras 
    WHERE NOT EXISTS (SELECT * FROM [s].[dbo].[Infolog_ArtigoEAN] WHERE ArtigoID = @ArtigoID AND TipoArtigo = @TipoArtigo AND CodBarras = @CodBarras) 
    -- Inserts above if nox exist, update below in any case. 
    UPDATE [s].[dbo].[Infolog_ArtigoEAN] SET CodBarras = '' WHERE ArtigoID = @ArtigoID AND TipoArtigo = @TipoArtigo AND CodBarras = @CodBarras 

    INSERT INTO [s].[dbo].[ArtigoEAN] 
    SELECT @ArtigoID,@TipoArtigo,@CodBarras 
    WHERE NOT EXISTS (SELECT * FROM [s].[dbo].[Infolog_ArtigoEAN] WHERE ArtigoID = @ArtigoID AND TipoArtigo = @TipoArtigo AND CodBarras = @CodBarras) 
    UPDATE [s].[dbo].[ArtigoEAN] SET CodBarras = '' WHERE ArtigoID = @ArtigoID AND TipoArtigo = @TipoArtigo AND CodBarras = @CodBarras 

    END 
    -- 
    IF @CodBarras IS NOT NULL AND (@ArtigoID IS NULL AND @TipoArtigo IS NULL) 
    BEGIN 

    UPDATE [s].[dbo].[FArtigo] SET CodBarras = '' WHERE CodBarras = @CodBarras 
    UPDATE [s].[dbo].[Infolog_ArtigoEAN] SET CodBarras = '' WHERE CodBarras = @CodBarras 
    UPDATE [s].[dbo].[ArtigoEAN] SET CodBarras = '' WHERE CodBarras = @CodBarras 

    END 
END 

내 질문에, 왜 난 그냥 변경하고 때 라인 (48) 후 INSERT을 위해 노력하고있다 (

저장 :

이 내 전체 코드입니다 (내가 라인 (48)을 신호)) 프로 시저, 심지어 매개 변수를 실행하지 않습니다. (SELECT 존재합니다 WHERE WHERE myCondition = notExist)

dbo.Example * FROM) 내가, 경우 (INSERT INTO dbo.Example SELECT가 (, 삽입을 조건으로 SELECT를 사용하여 실제 삽입 할 것을 염두에

유지

답변

0

테이블의 열 수와 삽입 문에 지정한 값 수가 일치하지 않기 때문에이 오류가 발생합니다.

쿼리에서 사용자가 제공 한 값은 3 개이므로 가능한 것입니다. 테이블에 3 열 이상 또는 3 열 미만이 있습니다.

이러한 오류를 방지하려면 나중에 지정하는 대신

INSERT INTO TableName 
VALUES(1,2,3) 

값을 삽입 할 열 이름을 지정하십시오. 마찬가지로이

INSERT INTO TableName(Col1,Col2,Col3) 
VALUES(1,2,3) 

또는

INSERT INTO X(Col1,Col2,Col3) 
SELECT @A, @B, @C 

당신은 SQL Server는 컴파일 시간, 즉에 오류가 반환됩니다 오류를 얻을 수있는 스크립트/프로 시저를 실행할 필요가 없습니다; 프로 시저를 만들거나 변경할 때

+0

글쎄, 조건문이 참인 경우에만 삽입하고 싶습니다. SELECT를 VALUES 안에 두어야합니까? 내 편집 된 질문보기 (최종 파트) – Tiago

+0

선택을 위해 하나의 샘플을 추가했습니다. –

+0

제안 및 설명에 감사드립니다. – Tiago