2017-08-21 15 views
1

この質問はthis oneの後に続きます。テーブル値のパラメータを参照するときにスカラー変数を宣言する必要があります

以下SQL作品:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Update_Repair_Details] 
    @RepairID BIGINT, 
    @NewDetails NewDetails READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM Repair_Details 
    WHERE RepairID = @RepairID 

    INSERT INTO Repair_Details 
     SELECT *, GETDATE() 
     FROM @NewDetails 
END 

しかしRepairIDがユーザー定義テーブル型の最初の列であるため、追加のパラメータとして渡す理由はありません。

は、このように私が書いた:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Update_Repair_Details] 
    @NewDetails NewDetails READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM Repair_Details 
    WHERE RepairID = @NewDetails.RepairID 

    INSERT INTO Repair_Details 
     SELECT *, GETDATE() 
     FROM @NewDetails 
END  

エラーを引き起こす:以前のバージョンにはないながら

Must declare the scalar variable "@NewDetails"

は、なぜこれがエラーを持っているのでしょうか?

答えて

2

この場合、@NewDetailsはテーブルです。そのように、あなたはただWHERE RepairID = @NewDetails.RepairIDをすることはできません。 (私はSQLにかなり新しいです)

ALTER PROCEDURE [dbo].[Update_Repair_Details] 
@NewDetails NewDetails READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DELETE A 
    FROM Repair_Details A 
    INNER JOIN @NewDetails B 
     ON A.RepairID = B.RepairID; 

INSERT INTO Repair_Details 
SELECT *, GETDATE() 
FROM @NewDetails; 
END 
+0

私はこの答えをよりよく理解したいと思います:あなたはINEXISTSまたはJOINを使用することができます。 AはRepair_Detailsの代名詞ですか?Bは@NewDetailsの代名詞ですか?しかし、私が代用をすると、OPと同じエラーが出ます。 AとBが果たす役割を説明してください。 – SezMe

+0

私はちょうど "FROM句でJOINでテーブル値のパラメータを使用するときには、別名を付けなければなりません..."というように、AとBはエイリアスの役割を果たします。 – SezMe

+0

@SezMeはい、それらはテーブルエイリアスです。同じエラーが出ていますか?それは変です。 'NewDetails'タイプの定義を投稿してください – Lamak