INSERT из JOIN вставляет нулевые значения

Необходимость вставки значений из 3-х таблиц в другую таблицу с именем myTable. Обязательные поля в myTable:

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

Я создал хранимую процедуру ниже. Но после просмотра таблицы обнаружил, что сохраняются только переданные параметры! то есть @Id_student , @id_subjects , @degrees. Кто-нибудь может объяснить, что не так с этим кодом?

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 источник
comment
@Siva, ты должен опубликовать это как ответ,   -  person Habib    schedule 01.05.2012
comment
@Siva INTO является необязательным в соответствии со спецификациями T-SQL: msdn.microsoft.com /en-us/library/ms174335.aspx   -  person Cristian Lupascu    schedule 01.05.2012
comment
@Siva, спасибо, но [Into] — это необязательное ключевое слово, которое можно использовать между INSERT и целевой таблицей. См. ссылка   -  person Salahaldin    schedule 01.05.2012
comment
ваш SQL кажется правильным. Попробуйте запустить select только для того, чтобы увидеть, какие результаты вы получите (возможно, вы вставляете данные NULL)   -  person Cristian Lupascu    schedule 01.05.2012
comment
@Siva Я тоже не знал об этом несколько недель назад :)   -  person Cristian Lupascu    schedule 01.05.2012


Ответы (1)


Я думаю, вам следует снять скобки вокруг оператора SELECT и исправить порядок ключевых слов/клаузул join-on.

Попробуйте эту версию:

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
вы можете попробовать запустить только select? он возвращает действительные данные? - person Cristian Lupascu; 01.05.2012
comment
да Это так.. но поля ([st_Name], [Id_Class], [Id_Group], Class, [group]) пусты. - person Salahaldin; 01.05.2012
comment
ну тогда проблема должна быть с данными, которые равны нулю. - person Cristian Lupascu; 01.05.2012
comment
Я уверен, что с моими данными все в порядке. Спасибо. - person Salahaldin; 02.05.2012
comment
Возможно, вы можете показать нам некоторые образцы данных. Таким образом, мы сможем диагностировать, почему в результатах есть null. - person Cristian Lupascu; 02.05.2012