Инструкция INSERT не может содержать инструкцию SELECT -sql server2012

    declare @us table(name nvarchar(100),lastname nvarchar(100),UID bigint,available bit);
        declare
        @Name nvarchar(100),
        @lastname nvarchar(100),
        @UID bigint,
        @Avail bit

        insert into @us
        select @name=name,@lastname=lastname,@UID=UID,@Avail=available from Users where available='1'
 select * from @us

Я получил эту ошибку

Инструкция INSERT не может содержать инструкцию SELECT, которая присваивает значения переменной.

Я искал эту проблему, но многие люди использовали такие запросы, и они сказали, что нет проблем! Я использую SQL Server 2012, это разница между MSSQL2012 и MSSQL2008? и каково лучшее решение, если я хочу вернуть таблицу из моих хранимых процедур? что не так в моем запросе?

2 ответа

Решение

Исходя из информации, представленной в вопросе, переменные кажутся ненужными. Вы можете напрямую сделать INSERT...SELECT вот так:

declare @us table(name nvarchar(100),lastname nvarchar(100),UID bigint,available bit);

insert into @us
select name,lastname,UID,available 
from Users 
where available='1'

select * from @us

Альтернативный и сложный способ выполнения одной и той же задачи приведен ниже. Надеюсь, никому это не нравится. Просто я показываю, что у нас есть еще один альтернативный способ.

declare @us table(name nvarchar(100),lastname nvarchar(100),UID bigint,available bit);
declare @Name nvarchar(100), @lastname nvarchar(100), @UID bigint,@Avail bit

DECLARE ALLRECORDS CURSOR FOR 
    SELECT name,lastname,UID,available from Users where available='1'

     OPEN ALLRECORDS
     FETCH NEXT FROM ALLRECORDS INTO @Name,@lastname,@UID,@Avail

        WHILE @@FETCH_STATUS = 0
        BEGIN
        INSERT INTO @us    
        SELECT @Name,@lastname,@UID,@Avail 

        FETCH NEXT FROM ALLRECORDS INTO @Name,@lastname,@UID,@Avail
        END
CLOSE ALLRECORDS
DEALLOCATE ALLRECORDS
SELECT * FROM @us
Другие вопросы по тегам