2017-12-27 25 views
0

必要に応じてINSERT/UPDATEするストアドプロシージャを作成しました。SELECT変数をINSERT値として使用している列名がテーブルと一致しません

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] 列名または指定された値の数がテーブル定義と一致しません。

これは私の完全なコード(私はライン48を合図)である:私はちょうど(保存も変更するのです時に私の質問は、なぜそれがライン48の後にINSERTをやろうとしているされて

@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 

)プロシージャ、私はパラメータでそれを実行していない。

(dbo.Example myCondition = notExist SELECT * FROM)EXISTS、NOT WHERE)真、であれば、挿入に(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

ただし、条件をtrueにするだけでIFを挿入します。 SELECTをVALUESの中に入れるべきですか?私の編集した質問(最後の部分)を参照 – Tiago

+0

選択のために1つのサンプルを追加しました –

+0

提案と説明をありがとう。 – Tiago

関連する問題