2009-12-15 3 views
0

SQL Server 2008을 사용하고 유지 관리 단계에있는 프로젝트를 개발 중입니다.SQL Server에 대한 SQL 삽입 관련 쿼리?

기본 키가 정수이지만 ID가 아닌 테이블에 레코드를 삽입하려고합니다. 예 : 테이블 이름은 tblFiles이고 필드는 ID, FileName, FileContent입니다.

실제로 테이블이 사용 중이므로 스키마를 변경하고 싶지 않습니다. 행 삽입 후 키를 원한다. 다른 테이블에 삽입해야하기 때문이다. Id 열의 기존 값은 서로 다른 정수이며 순차적이지 않습니다.

그래서 나에게도 Id 값을 반환하는 쿼리를 원합니다. 그것이 IDENTITY 필드 아니라면 그래서 내가 고유 한 ID를 삽입하고 또한 나에게 해당 ID

+1

ID 열에 적어도 고유 한 제약 조건이 있습니까? –

+3

기본 키인 경우 고유성을 자동으로 암시하지 않습니까 ?? –

+0

"ID"가 생성되는 이유는 무엇입니까? – Woot4Moo

답변

4

음을 보내 내 삽입 쿼리에 누구를 포함 할 수 있습니다 만 FileNameFileContent 및 SQL의 일종을 삽입 할, -하지 당신은 이미 그것이 성공하기 위해 삽입물에 "ID"를 지정해야합니까? 그렇다면 이미 ID가 있습니다! 아니면 나는 무엇을 놓치고 있습니까? ID는 트리거 또는 무언가에 의해 결정됩니까 ??

그렇다면,이 쿼리를 시도 :

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

이것은 INSERT 쿼리에서 새로 삽입 된 ID를 반환해야합니다.

마크

tblFiles

그리고 단순히 경우와 쿼리 또는 SPROC에서 반환이 FROM

SELECT MAX (ID) + 1을 사용하여 당신은 고유 한 정수, 그리 우아를 만들 수

+0

나는 그가 스키마를 변경하지 않고 자동으로 생성 된 ID를 찾고 있다고 생각한다. – womp

+0

@womp : OK,이 경우 INT IDENTITY 필드가있는 도우미 테이블을 추가하고 거기에 더미 행을 삽입하고 새 자동 생성 ID를 가져온 다음 'tblFiles' 테이블에 사용하십시오 –

+0

@Marc; 고마워요. 제 대답을 게시했습니다. 마지막 질문을 게시 했으므로 최종 질문을 작성하는 데 도움이됩니다. 대답을 표시하고 있습니다. – Azhar

1

, 아마도. 그렇지 않으면 이미 알려진 경우 marc_s가 말하는대로 따르십시오.

업데이트 : 요청한 바와 같이이 퍼지보다 오히려 열심히 밀어 내고 테이블을 변경하는 것이 좋습니다. 이는 이것이 ID 열이므로 변경할 수 있습니다. 지금까지의 모든 대답은 단순히 퍼지입니다. 특히 그렇습니다.

+1

이것은 바쁜 다중 사용자 시스템에서 실제로 정말 나쁜 디자인입니다 - 시간이 지나면 중복 된 것을 보장하는 ** ** –

+0

@marc_s는 당신의 요점을 알고 있지만 알아야합니다. 이것은 바쁜 시스템이거나이 삽입에 테이블 잠금이있을 가능성이 있습니다. 제가 신발에 있다면, 단순히 이런 퍼지보다 정체성을 적용해야 할 것입니다. 나는 이것을 대답에 넣을 것이라고 생각한다. ... – dove

+1

@marc_s btw, 기본 키라면 중복은 불가능하지만, 자물쇠가 없을 경우 삽입하려고 시도하면 오류가 발생한다. – dove

1

열 ID 사양> ID가 예를 변경하십시오.

다음은 테이블에 삽입 한 후 수

Select SCOPE_IDENTITY() 

방금 ​​추가하여 SP에이를 반환 된 정수를 얻을 수 있습니다.

데이터베이스 스키마를 실제로 편집 할 수없는 경우 ID 및 CurrentDate라는 두 개의 열이있는 다른 테이블을 데이터베이스에 추가 할 수 있습니다. ID 열을 ID로 만듭니다. 코드에서이 테이블을 삽입하려면 먼저 SCOPE_IDENTITY()를 선택한 다음 반환 된 정수를 사용하여 tblFles 테이블의 ID로 삽입하십시오.

P. tbl로 테이블 접두사를 그만두세요. 1999 년입니다. :)

+0

pps : shouuld 우리는 테이블 앞에 "T_"접두어를 붙이기 시작합니까? ;-) –

+0

그것이 2001 년입니다. –

1

그래서 최종 쿼리는 다음과 같습니다.

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

우리는 정수 변수에 최대 (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이 조건은 데이터가 null이고 0 + 1 = 1이 될 것입니다.

고맙습니다.