2009-06-01 30 views
25

Trong SQL Server 2000 hoặc cao hơn là có anyway để xử lý tự động tạo ra khóa chính (nhận dạng) cột khi sử dụng một tuyên bố như sau?Xử lý các cột nhận dạng trong câu lệnh "Chèn vào giá trị TABLE()"?

Insert Into TableName Values(?, ?, ?) 

Mục tiêu của tôi là KHÔNG sử dụng tên cột.

+4

tại sao bạn không muốn sử dụng một danh sách tên cột? –

+0

@Mitch, nó khá phức tạp, nhưng tôi có một chương trình tạo SQL ngay lập tức và trong thiết kế ban đầu của tôi, tôi đã không xử lý bất kỳ cột nhận dạng nào nên tôi đã loại trừ các tên cột. Tôi cần cập nhật nhanh và tôi có thể tránh sử dụng tên cột để dễ dàng hơn. –

+0

@ nemo-- Đã ở trong tình huống "vá nhanh" trước đây, tôi sẽ cung cấp cho bạn thông tin này ngay bây giờ. Nhưng xin vui lòng, vì lợi ích của riêng bạn, hãy lên kế hoạch chỉ định tên cột trong bản cập nhật đầy đủ tiếp theo .... – RolandTumble

Trả lời

49

Theo mặc định, nếu bạn có một cột sắc, bạn làm không cần phải xác định nó trong VALUES phần. Nếu bảng của bạn là:

ID NAME ADDRESS 

Sau đó, bạn có thể làm:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA') 

Điều này sẽ tự động tạo ID cho bạn, và bạn không phải suy nghĩ về điều đó chút nào. Nếu bạn SET IDENTITY_INSERT MyTbl ON, bạn có thể chỉ định giá trị cho cột ID.

+1

Oh thực sự? Điều đó thật tuyệt vời. Tôi đã giả định rằng nó sẽ không hoạt động. Để tôi thử. –

+0

@Eric là chính xác những gì tôi có nghĩa là ở điểm 1 ở trên (đã chỉnh sửa để hiển thị ý định của tôi), +1 –

+0

Eric này không làm việc cho tôi cả. Đó là phàn nàn rằng tôi có, nhận dạng chèn ra, tôi giả sử bởi vì nó đang cố gắng để chèn mục đầu tiên trong các giá trị vào ID. Bất cứ điều gì cụ thể bạn phải thiết lập để làm cho nó bỏ qua cột đầu tiên? –

6

Bạn có 2 lựa chọn:

1) Chỉ định danh sách tên cột (không có cột nhận dạng).

2) Đặt IDENTITY_INSERT tablename ON, tiếp theo là chèn câu lệnh cung cấp giá trị rõ ràng cho cột nhận dạng, tiếp theo là SET IDENTITY_INSERT tablename OFF.

Nếu bạn đang tránh một danh sách tên cột, có lẽ đây 'lừa' có thể giúp ?:

-- Get a comma separated list of a table's column names 
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()] 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'TableName' 
Order By Ordinal_position 
FOR XML PATH('') 
), 1,1, '') 
+0

Chỉ cần làm rõ, bằng giá trị rõ ràng bạn có nghĩa là bạn phải truy vấn cơ sở dữ liệu để xem danh tính tiếp theo trong chuỗi sẽ được và chèn nó bằng tay? –

+0

Không, bạn có thể sử dụng bất kỳ giá trị nào không có sẵn, nhưng chuỗi tiếp theo sẽ bắt đầu từ giá trị lớn nhất .... –

+0

Chỉ có xu hướng được sử dụng khi bạn có dữ liệu tham chiếu cần có chính xác cùng một giá trị ID trên các cài đặt ứng dụng khác nhau –

2

Vì nó không phải là thực tế để đặt mã trong một chú thích, để đáp ứng với nhận xét của bạn trong câu trả lời của Eric rằng nó không làm việc cho bạn ...

Tôi chỉ cần chạy sau đây trên một hộp SQL 2005 (xin lỗi , không có 2000 tiện dụng) với cài đặt mặc định và nó hoạt động mà không có lỗi:

CREATE TABLE dbo.Test_Identity_Insert 
(
    id INT IDENTITY NOT NULL, 
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id) 
) 
GO 

INSERT INTO dbo.Test_Identity_Insert VALUES ('test') 
GO 

SELECT * FROM dbo.Test_Identity_Insert 
GO 

Bạn có lẽ đang gửi giá trị ID trong danh sách giá trị của mình không? Tôi không nghĩ rằng bạn có thể làm cho nó bỏ qua cột nếu bạn thực sự vượt qua một giá trị cho nó. Ví dụ: nếu bảng của bạn có 6 cột và bạn muốn bỏ qua cột IDENTITY, bạn chỉ có thể vượt qua 5 giá trị.

+0

Phát biểu của bạn cũng tốt cho tôi, rất lạ. –

22

Một "thủ thuật" khác để tạo danh sách cột chỉ đơn giản là kéo nút "Cột" từ Object Explorer vào cửa sổ truy vấn.

+3

+1 Điều này đã giúp tôi rất nhiều. Ngoại trừ những cơn giận dữ với dấu ngoặc vuông. – Kermit

+1

Có thể là mẹo hay nhất mà tôi từng nhận được từ SO. Tuyệt vời! – ryanulit

9

Cách tốt nhất là liệt kê một cách rõ ràng các cột: (? ?,,)

Insert Into TableName (col1, col2, col2) Giá trị

Nếu không chèn ban đầu của bạn sẽ phá vỡ nếu bạn thêm một cột vào bảng của bạn.

+0

Vâng ông chủ của tôi thực sự đã nói điều tương tự. Cả hai bạn đều hoàn toàn đúng, nhưng dữ liệu trong cơ sở dữ liệu này là trong giấy phép (tức là bị xóa sổ và tái tạo hàng ngày) vì vậy nếu một cái gì đó như thế này xảy ra nó sẽ không phải là kết thúc của thế giới. –

1

Giải pháp:

1) Set IDENTITY_INSERT ON.

2) Chèn dữ liệu khách hàng vào bảng Khách hàng.

3) Đặt IDENTITY_INSERT thành TẮT.

đọc toàn bộ bài viết here.

+0

Câu hỏi không phải là về việc ghi đè cột nhận dạng, nhưng về cách tránh sử dụng tên trường và để cột nhận dạng hoạt động như dự định. – bummi

0
set identity_insert customer on 
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234) 

nơi 'khách hàng' là tên bảng

Các vấn đề liên quan