INSERT dari JOIN menyisipkan nilai nol

Kebutuhan untuk memasukkan nilai dari 3 tabel ke tabel lain yang disebut myTable. Bidang yang wajib diisi di myTable adalah:

[Id_student] int,
[id_subjects] int
[degrees] float
[st_Name] nvarchar(30) 
[Id_Class] int
[Id_Group] int 
[Class] nvarchar(15)
[group] nvarchar(15))` ..

Saya membuat prosedur tersimpan di bawah ini. Tetapi setelah melihat tabel saya menemukan bahwa hanya parameter yang diteruskan yang disimpan! yaitu @Id_student , @id_subjects , @degrees. Adakah yang bisa menjelaskan apa yang salah dengan kode ini?

CREATE storedprocedure mySp_myTable_insert
        @Id_student  int,
        @id_subjects int,
        @degrees     int
as

DECLARE @st_Name nvarchar(30) 
SELECT @st_Name  = pst.st_Name  FROM dbo.sudents  AS pst where pst.id_student=@id_student ;

INSERT [myTable]
    (
        [Id_student],
        [id_subjects],
        [degrees],
        [st_Name],
        [Id_Class],
        [Id_Group],
        [Class],
        [group]
    )

    (select
        @Id_student,
        @id_subjects,
        @degrees,
        @st_Name
        ,tc.Id_Class
        ,tg.Id_Group
        ,tc.Class
        ,tg.group
    from dbo.subjects sbj 
    inner join tGroup tg 
    inner join tClass tc
        on tc.Id_Class=tg.Id_Class 
        on sbj.Id_Group =tg.Id_Group 
    where sbj.id_subjects=@id_subjects)

person Salahaldin    schedule 01.05.2012    source sumber
comment
@Siva, Anda harus memposting ini sebagai jawaban,   -  person Habib    schedule 01.05.2012
comment
@Siva INTO bersifat opsional sesuai dengan spesifikasi T-SQL: msdn.microsoft.com /en-us/library/ms174335.aspx   -  person Cristian Lupascu    schedule 01.05.2012
comment
@Siva, terima kasih, tapi [Into] Merupakan kata kunci opsional yang dapat digunakan antara INSERT dan tabel target. Lihattautan   -  person Salahaldin    schedule 01.05.2012
comment
SQL Anda tampaknya benar. Coba jalankan select saja untuk melihat hasil yang Anda dapatkan (mungkin data yang Anda masukkan adalah NULL)   -  person Cristian Lupascu    schedule 01.05.2012
comment
@Siva Saya juga tidak menyadarinya sampai beberapa minggu yang lalu :)   -  person Cristian Lupascu    schedule 01.05.2012


Jawaban (1)


Saya pikir Anda harus menghilangkan tanda kurung di sekitar pernyataan SELECT dan memperbaiki urutan kata kunci/klausa join-on.

Coba versi ini:

CREATE storedprocedure mySp_myTable_insert
        @Id_student  int,
        @id_subjects int,
        @degrees     int
as

DECLARE @st_Name nvarchar(30) 
SELECT @st_Name  = pst.st_Name  FROM dbo.sudents  AS pst where pst.id_student=@id_student ;

INSERT [myTable]
    (
        [Id_student],
        [id_subjects],
        [degrees],
        [st_Name],
        [Id_Class],
        [Id_Group],
        [Class],
        [group]
    )
select
    @Id_student,
    @id_subjects,
    @degrees,
    @st_Name
    ,tc.Id_Class
    ,tg.Id_Group
    ,tc.Class
    ,tg.group
from dbo.subjects sbj 
inner join tGroup tg on sbj.Id_Group =tg.Id_Group
inner join tClass tc on tc.Id_Class=tg.Id_Class 
where sbj.id_subjects=@id_subjects

GO
person Cristian Lupascu    schedule 01.05.2012
comment
dapatkah Anda mencoba menjalankan select saja? apakah itu mengembalikan data yang valid? - person Cristian Lupascu; 01.05.2012
comment
ya Benar.. tetapi bidang ( [st_Name],[Id_Class],[Id_Group],Class, [group]) adalah null. - person Salahaldin; 01.05.2012
comment
kalau begitu, masalahnya pasti pada datanya yang null. - person Cristian Lupascu; 01.05.2012
comment
Saya yakin data saya baik-baik saja, terima kasih - person Salahaldin; 02.05.2012
comment
Mungkin Anda bisa menunjukkan kepada kami beberapa contoh data. Dengan cara ini kami dapat mendiagnosis mengapa ada nulls pada hasilnya. - person Cristian Lupascu; 02.05.2012