2016-08-11 2 views
1

SQL n00b здесь. Любая идея, что я делаю неправильно? Надеюсь, вы сможете понять, на что я намереваюсь.Как создать временную переменную, равную id последней вставленной строки

DECLARE @CatId INT; 
SET @CatId = (
    INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
    SELECT SCOPE_IDENTITY() 
); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

Я получаю не-очень детализированные ошибку

Неправильный синтаксис около 'INSERT'

+0

В вашем запросе нет 'IMPORT' – Lamak

+1

Вы не можете установить такую ​​переменную. –

+0

использовать OUTPUT, вставленный в таблицу temp или таблицу, особенно если ваша операция установки будет более 1 записи. – Matt

ответ

1

Вам даже не нужна переменная для этого. Помните директора KISS.

INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (SCOPE_IDENTITY(),'TestName','TestDisplayName'); 
0

Вы можете использовать IDENT_CURRENT

DECLARE @CatId INT 
SELECT @CatId = IDENT_CURRENT('Categories') 

Затем повторно использовать @CatId в INSERT

INSERT INTO Fields (CategoryID, FieldName, DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

IDENT_CURRENT возвращает последнее значение идентификатора созданного для конкретной таблицы в любой сессии и любого масштаба.

Если вам это нужно, чтобы быть только областью видимости сеанса вы можете использовать SCOPE_IDENTITY

+0

У этого есть потенциальные проблемы параллелизма. –

+0

@SeanLange, если несколько сеансов являются проблемой, OP может использовать 'SCOPE_IDENTITY' –

+0

. Ваш код должен ВСЕГДА иметь возможность обрабатывать несколько сеансов. Когда вы используете IDENT_CURRENT, вы создаете условие гонки. Зачем использовать что-то, что может быть проблемой? Просто используйте SCOPE_IDENTITY, и вам не нужно его квалифицировать. –

3

В SQL Server, правильный способ справиться с этим является статья OUTPUT. Я бы рекомендовал вам изучить этот метод и придерживаться его.

DECLARE @CatIds TABLE (catid int); 

INSERT INTO Categories (CategoryName) 
    OUTPUT inserted.catid INTO @CatIds; 
    VALUES ('TestCategory'); 

INSERT INTO Fields(CategoryID, FieldName, DisplayName) 
    SELECT CatId, 'TestName', 'TestDisplayName' 
    FROM @CatIds; 

Это предпочтительнее других методов, поскольку он явно фиксирует нужную информацию в таблицу, которая затем может быть подвергнут дальнейшей обработке. Код более надежный, потому что нет опасности добавить строку кода «между ними» и сломать существующий код. Он также поддерживает вставки нескольких значений одновременно.

Смежные вопросы