Как сделать оператор вставки, используя не автоматический идентификатор приращения? - PullRequest
3 голосов
/ 18 июля 2011

Тот же вопрос был задан для MySQL здесь , в любом случае, синтаксис не работает в SQL Server.

Я вставляю образец из этого вопроса (упрощая его) здесь, потому чтоэто объясняет, что мне нужно очень хорошо.

DECLARE @t1 integer
SET @t1=0;
-- MyTable is a simple Table with 2 fields "MyID" and "MyValue"
insert into MyTable
SELECT  @t1 := @t1+1, --this "should" work in MySQL
  MyAnotherValue
FROM    AnotherTable

Есть ли способ добиться того же в SQL Server (без использования курсора)?

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

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Это будет работать, даже если вы запустите его более одного раза:

insert into MyTable(MyId, MyValue)
  select (select isnull(max(MyId), 0) from MyTable) + -- avoid duplicated keys, if you repeat this insert again
         row_number() over(order by MyAnotherValue),
         MyAnotherValue
    from AnotherTable

Функция isnull() охватывает случай, когда MyTable пусто

3 голосов
/ 18 июля 2011

Этого можно добиться с помощью Row_Number ()

Insert Into dbo.AnotherTable (Col1, Col2)
Select Row_Number() Over(Order By SomeColumn),
       SomeColumn

From dbo.YourTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...