Запрос относительно вставки SQL в SQL Server?

Я использую SQL Server 2008 и разрабатываю проект, который находится на стадии обслуживания.

Я хочу вставить запись в таблицу, первичный ключ которой является целым числом, но не идентификатором. например имя таблицы tblFiles и поля ID, FileName, FileContent.

На самом деле эта таблица уже используется, поэтому я не хочу вносить в нее какие-либо изменения в схеме. И мне нужен ключ после вставки строки, потому что я должен поместить его в другую таблицу. Существующие значения в столбце Id - разные целые числа, то есть не в последовательности.

Поэтому мне нужен запрос, который также возвращает мне значение Id. Поэтому я хочу вставить только FileName и FileContent и какой-то sql, в который я могу встроить свой запрос вставки, который вставляет уникальный идентификатор, а также отправляет мне этот идентификатор


person Azhar    schedule 15.12.2009    source источник
comment
Есть ли хотя бы уникальное ограничение на столбец идентификатора?   -  person Joel Coehoorn    schedule 15.12.2009
comment
ну, если это первичный ключ, разве это не означает автоматически уникальность ??   -  person marc_s    schedule 15.12.2009
comment
Что генерирует идентификатор для вас?   -  person Woot4Moo    schedule 15.12.2009


Ответы (5)


Что ж, если это не поле IDENTITY - разве вам уже не нужно указывать «ID» в своей вставке, чтобы это было успешно? Если да, то у вас уже есть идентификатор! Или что мне не хватает? Идентификатор определяется триггером или чем-то еще ??

Если да, попробуйте этот запрос:

INSERT INTO dbo.tblFiles(FileName, FileContent)
OUTPUT inserted.ID
VALUES ('yourfile.name', 'your contents')

Это должно вернуть вновь вставленный идентификатор из запроса INSERT.

Марк

person marc_s    schedule 15.12.2009
comment
Я думаю, он ищет автоматически сгенерированный идентификатор, не меняя для этого схему. - person womp; 15.12.2009
comment
@womp: Хорошо, в этом случае я бы, вероятно, добавил вспомогательную таблицу с полем INT IDENTITY и вставил туда фиктивную строку и получил новый автоматически сгенерированный идентификатор, а затем использовал бы его в таблице tblFiles - person marc_s; 15.12.2009
comment
@Marc; Спасибо, я опубликовал свой ответ, так как я опубликовал свой последний qyuery, ваш ответ помогает мне составить окончательный запрос, я отмечаю ваш ответ. - person Azhar; 16.12.2009

Измените Спецификацию удостоверения столбцов> Идентичность на Да.

После вставки в таблицу вы можете

Select SCOPE_IDENTITY() 

чтобы получить только что добавленное целое число и вернуть его в свой SP.

Если вы действительно не можете редактировать схему базы данных, возможно, вы могли бы добавить в базу данных еще одну таблицу с двумя столбцами с именами ID и CurrentDate. Сделайте столбец идентификатора идентификатором. При вставке кода в эту таблицу сначала выберите SCOPE_IDENTITY (), а затем используйте возвращенное целое число для вставки в качестве идентификатора в таблицу tblFles.

P.S. Прекратите ставить в таблице префикс tbl, это значит 1999 год. :)

person Martin Beeby    schedule 15.12.2009
comment
pps: не стоит ли вместо этого начинать префиксы таблиц с T_ ?? ;-) - person marc_s; 15.12.2009

Вы можете создать уникальное целое число не так элегантно, используя

ВЫБРАТЬ МАКС. (ID) + 1 ИЗ tblFiles

И просто верните это из своего запроса или, в зависимости от случая, из sproc. В противном случае следуйте указаниям marc_s, если это уже известно.

ОБНОВЛЕНИЕ: должен сказать, что вместо этой выдумки, как было запрошено, я настоятельно рекомендовал бы сильно оттолкнуться и изменить таблицу, чтобы это был столбец идентификации, так как это то, что есть. все ответы пока просто выдумки, особенно мой.

person dove    schedule 15.12.2009
comment
это действительно плохой дизайн в загруженной многопользовательской системе - вы абсолютно гарантированно, что дубликаты появятся в кратчайшие сроки ... - person marc_s; 15.12.2009
comment
@marc_s поймите вашу точку зрения, но ему нужно знать, загружена ли это система или, вероятно, на этой вставке есть блокировка таблицы. если бы я был на его месте, я бы просто настаивал на применении личности, а не на какой-либо из этих выдумок. думаю, я поставлю это в ответ .... - person dove; 15.12.2009
comment
@marc_s Кстати, если это первичный ключ, дублировать будет невозможно, но, по общему признанию, вы получите ошибку при попытке вставить, если на месте нет блокировок. - person dove; 15.12.2009
comment
@dove: true - первичный ключ предотвратит дублирование, но у вас будут ошибки, которые может быть трудно найти и отследить. И я согласен - простое использование IDENTITY было бы НАИБОЛЕЕ простым решением ... - person marc_s; 15.12.2009

так что мой последний запрос выглядит так ...

Insert into dbo.tblData (Id, FName, LName) 
output inserted.Id
values ((SELECT MAX(ID) + 1 FROM dbo.tblData), 'xyz', 'abc')
person Azhar    schedule 16.12.2009

Мы можем присвоить max (ID) +1 в целочисленной переменной, затем мы можем вставить

Declare @ID int
Select @ID = ISNULL(MAX(ID),0) + 1 FROM tblFiles

INSERT INTO tblFiles 
(
  ID, FileName, FileContent
)
Select @ID,'FileName','FileContent'

Эта вставка прямая,

INSERT INTO tblFiles 
(
  ID, FileName, FileContent
)
 Select (Select ISNULL(MAX(ID),0) + 1 FROM tblFiles),'FileName','FileContent'

Здесь мы должны использовать условие ISNULL, потому что в таблице нет данных, тогда оно вернет Null. Итак, ISNULL (MAX (ID), 0) + 1 это условие даст Data is null, тогда 0 + 1 = 1.

Спасибо

person Jom George    schedule 16.10.2012