Bài viết này khám phá các kỹ thuật khác nhau để chèn dữ liệu vào SQL Server.

Bạn đang xem : cách thêm dữ liệu vào sql

Tóm tắt

Có nhiều cách quản lý dữ liệu để chèn vào SQL Server. Cách chúng tôi tạo và chèn dữ liệu vào bảng có thể có tác động sâu sắc đến hiệu suất và khả năng bảo trì! Chủ đề này thường được người mới bắt đầu xem xét, nhưng những sai lầm trong cách chúng tôi phát triển đối tượng có thể khiến các nhà phát triển và quản trị viên trong tương lai phải đau đầu.

Trong bài viết này, chúng ta sẽ khám phá các cách khác nhau mà chúng ta có thể tạo và chèn dữ liệu vào cả các đối tượng vĩnh viễn và tạm thời. Hiệu suất, cú pháp, tài liệu và khả năng bảo trì sẽ được đánh giá cho từng phương pháp. Bằng cách nghiên cứu sâu hơn về chủ đề này, chúng tôi có thể cải thiện thiết kế cơ sở dữ liệu, chất lượng tập lệnh và xây dựng các đối tượng dễ bảo quản hơn và ít có khả năng bị hỏng do bảo trì hoặc phát hành phần mềm.

Dữ liệu demo

Tất cả các bản demo trong bài viết này sẽ sử dụng các đối tượng mới mà chúng tôi tạo ra ở đây. Điều này sẽ cho phép chúng tôi toàn quyền tùy chỉnh, kiểm tra và phá vỡ nó một cách độc lập với bất kỳ thứ gì khác mà chúng tôi đang làm việc.

Sau đây là TSQL để tạo một bảng có tên dbo.accounts:

1

2

3

4

5

6

7

8

9

TẠO

BẢNG

dbo

.

tài khoản

(

account_id

INT

KHÔNG

KHÔNG ĐỦ

IDENTITY

(

1

,

1

)

CONSTRAINT

PK_account

CHÍNH THỨC

TỪ KHÓA

ĐÃ ĐIỀU CHỈNH

,

account_name

VARCHAR

(

100

)

KHÔNG

KHÔNG ĐỦ

,

account_start_date

DATE

KHÔNG

KHÔNG ĐỦ

,

account_address

BIẾN HÌNH

(

1000

)

KHÔNG

KHÔNG ĐỦ

,

< p class = "crayon-line" id = "urvanov-Cú pháp-highlighter-62b140742ab75947750526-6">

account_type

BIẾN HÌNH

(

10

)

KHÔNG

NULL

,

account_create_timestamp

DATETIME

KHÔNG

KHÔNG ĐỦ

,

account_notes

VARCHAR

(

500

) < / p>

NULL

,

is_active < / p>

BIT

KHÔNG

KHÔNG ĐỦ

)

;

Đây là một bảng khá đơn giản với ID nhận dạng và một số cột chuỗi / ngày cho dữ liệu tài khoản. Khi chúng tôi thực hiện qua bài viết này, chúng tôi sẽ thêm và xóa các cột, cũng như tùy chỉnh thêm điều này.

Chèn dữ liệu vào SQL Server bằng danh sách cột rõ ràng

Hãy bắt đầu bằng cách đi thẳng vào một số cú pháp đơn giản nhất trong T-SQL: Câu lệnh INSERT. Cách phổ biến nhất để chèn các hàng vào bảng là làm như vậy với câu lệnh INSERT trong đó chúng tôi trích dẫn rõ ràng toàn bộ danh sách cột trước khi cung cấp các giá trị:

1

2

3

4

5

6

7

8

9

10

CHÈN

VÀO

dbo

.

tài khoản

(

account_name

,

account_start_date

,

account_address

,

account_type

,

account_create_timestamp

,

account_notes

,

is_active

)

GIÁ TRỊ

(

‘Ed’

‘s Account’

,

< p class = "crayon-s"> ‘5/1/2019’

,

‘Ed’

‘s Address’

,

‘THỬ NGHIỆM’

,

< / p>

< p class = "crayon-e"> NHẬN NGÀY

(

)

,

‘Đây là tài khoản thử nghiệm để lập mô hình dữ liệu này.’

,

0

)

;

Trong ví dụ này, chúng tôi cung cấp một danh sách cột hoàn chỉnh và sử dụng cú pháp VALUES để liệt kê các giá trị vô hướng để chèn vào bảng. Nếu muốn, chúng ta có thể chèn nhiều hàng thông qua cú pháp này, phân tách mỗi hàng bằng dấu phẩy.

Chúng tôi cũng có tùy chọn bỏ qua cột khỏi danh sách cột và CHỌN. Điều này có thể được sử dụng cho các cột cho phép NULL (và chúng tôi muốn để là NULL) hoặc cho các cột có các ràng buộc mặc định được xác định trên chúng (và chúng tôi muốn cột chấp nhận giá trị mặc định). Ví dụ sau cho thấy việc chèn tài khoản trong đó chúng tôi bỏ qua cột account_notes:

1

2

3

4

5

6

7

8

9

CHÈN

VÀO

dbo

.

tài khoản

(

account_name

,

account_start_date

,

account_address

,

account_type

,

account_create_timestamp

,

is_active

)

GIÁ TRỊ

(

‘Initech’

,

< p class = "crayon-s"> ‘2/19/1999’

,

‘4120 Freidrich Ln.’

,

‘TRỰC TIẾP’

,

GETUTCDATE

(

)

,

1

)

;

Sau hai lần chèn trên, chúng ta có thể xem dữ liệu kết quả và lưu ý rằng kết quả là những gì chúng ta mong đợi:

SQL Server cho phép chúng tôi bỏ qua cột account_notes và khi làm như vậy đã gán NULL vào vị trí của nó. Hãy thêm một ràng buộc mặc định vào cột này:

1

ALTER

BẢNG

dbo

.

tài khoản

THÊM

CONSTRAINT

DF_account_account_notes

DEFAULT

(

‘KHÔNG ĐƯỢC CẤP PHÉP’

)

CHO

account_notes

;

Với một ràng buộc mặc định trên cột, chúng tôi có thể kiểm tra một INSERT khác mà chúng tôi cố ý loại bỏ cột account_notes:

1

2

3

4

5

6

7

8

9

CHÈN

VÀO

dbo

.

tài khoản

(

account_name

,

account_start_date

,

account_address

,

account_type

,

account_create_timestamp

,

is_active

)

CHỌN

‘Dinosaur Corp’

,

‘1/1/2003’

,

‘Khoảng thời gian Trias’ < / p>

,

‘DEMO’

,

NGÀY NHẬN

(

)

,

1

;

Kết quả cho chúng ta thấy hàng mới trông như thế nào trong bảng của chúng ta:

Chúng ta có thể thấy rằng giá trị mặc định từ ràng buộc đã được áp dụng cho account_notes, như mong đợi. Tạo một ràng buộc mặc định có thể hữu ích để đảm bảo rằng một cột có thể được tạo KHÔNG ĐẦY ĐỦ và luôn được gán một giá trị. Nó cũng hữu ích khi chúng ta muốn có một cột thường không được gán giá trị, nhưng yêu cầu một cột cho ứng dụng hoặc mục đích báo cáo. Một ràng buộc mặc định không bao giờ được sử dụng để tạo dữ liệu giữ chỗ, giả mạo hoặc xáo trộn. Ví dụ: -1 là một lựa chọn tồi cho một cột số nguyên và 1/1/1900 là một lựa chọn tệ hại cho một cột ngày tháng vì mỗi cột cung cấp ý nghĩa khó hiểu, không trực quan đối với nhà phát triển hoặc ai đó sử dụng dữ liệu này.

Lợi ích chính của việc chèn dữ liệu với danh sách cột rõ ràng là bạn ghi lại chính xác cột nào đang được điền và dữ liệu nào đang được đưa vào mỗi cột. Nếu một cột bị bỏ lại khỏi danh sách, thì nó sẽ được đặt ở trạng thái NULL. Nếu cột NOT NULL không có ràng buộc mặc định nào bị loại khỏi danh sách, một lỗi sẽ được đưa ra, tương tự như sau:

Tương tự, nếu bạn vô tình bỏ quên một cột khỏi danh sách cột, bạn sẽ gặp lỗi sau:

Do đó, danh sách cột được cung cấp rõ ràng khiến bạn khó có thể vô tình bỏ quên các cột.

Tuy nhiên, cú pháp này có một nhược điểm và đó là khả năng bảo trì trong các tình huống mà lược đồ bảng thay đổi thường xuyên và có mong muốn luôn CHỌN *. Nếu bạn đang kết xuất dữ liệu vào một bảng đầu ra và không quan tâm đến thứ tự cột, cách nhập hoặc số lượng, thì việc phải luôn điều chỉnh danh sách cột để khớp với chi tiết CHỌN có thể là một rắc rối và không đáng để nỗ lực.

Chèn dữ liệu vào SQL Server mà không có danh sách cột rõ ràng

Điều này dẫn chúng ta đến một cách thay thế để chèn dữ liệu vào một bảng hiện có, đó là làm như vậy mà không có danh sách cột. Phụ trang của biểu mẫu này sẽ giống như sau:

1

2

3

4

5

6

7

8

9

CHÈN

VÀO

dbo

.

tài khoản

CHỌN

‘Công ty Pokemon’

,

’23/4/1998 ‘

,

‘Tầng 8 của Tháp Roppongi Hills Mori, Tokyo, Nhật Bản’

,

‘TRỰC TIẾP’

,

Xem Thêm  Trình chỉnh sửa HTML trực tuyến - tạo trang html trực tuyến miễn phí

NHẬN NGÀY

(

)

,

‘Rất có giá trị. Họ tạo ra tất cả Pokemon! ‘

,

1

;

Câu lệnh này thực thi thành công, mặc dù không có danh sách cột nào được cung cấp. Khi SQL Server liên kết truy vấn này với các đối tượng cơ bản của nó, nó sẽ kéo danh sách cột theo thứ tự và áp dụng nó cho dữ liệu đang được chèn. Nếu mọi thứ khớp với nhau, thì chúng tôi tốt để tiếp tục, nếu không, chúng tôi sẽ nhận được lỗi tương tự như hai lỗi mà chúng tôi đã thấy trước đó cho biết danh sách cột không khớp.

Ưu điểm (nếu chúng tôi muốn gọi nó là ưu điểm) của phương pháp này là nó nhanh chóng và ít yêu cầu bảo trì hơn vì không cần phải viết và duy trì danh sách các cột bằng phần chèn. Nhược điểm là nếu bạn không khớp các cột, bạn có thể nhận được một loại thông báo lỗi khác. Hãy xem xét truy vấn sau:

1

2

3

4

5

6

7

8

CHÈN

VÀO

dbo

.

tài khoản

CHỌN

‘Công ty Pokemon’

,

’23/4/1998 ‘

,

‘Tầng 8 của Tháp Roppongi Hills Mori, Tokyo, Nhật Bản’

,

NHẬN NGÀY

(

< p class = "crayon-sy">)

,

‘Rất có giá trị. Họ tạo ra tất cả Pokemon! ‘

,

0

;

Khi thực thi, chúng tôi nhận được một thông báo lỗi mới:

Trong trường hợp này, chúng tôi đã bỏ đi một cột, nhưng vì bảng này bao gồm các cột NULLable, nên SQL Server đã cố gắng so khớp các cột của bảng bằng cách sử dụng dữ liệu chúng tôi cung cấp, nhưng không thể khớp có ý nghĩa.

Do khả năng xảy ra lỗi khó hiểu và không thể dễ dàng khớp các cột với dữ liệu, việc chèn vào bảng mà không cung cấp danh sách cột không được xem là phương pháp hay nhất và nên tránh bất cứ khi nào có thể. Tôi khuyên bạn nên bao gồm danh sách cột trong tất cả các câu lệnh INSERT trừ khi bạn tình cờ có một trường hợp sử dụng rất độc đáo, trong đó sự tiện lợi của cú pháp đơn giản hơn nguy cơ vi phạm mã trong tương lai nếu lược đồ của bảng thay đổi.

Ngoài ra, danh sách cột cung cấp tài liệu rõ ràng cho người dùng về những gì đang được chèn và cột nào dữ liệu sẽ được đưa vào. Chúng tôi có thể cải thiện điều này hơn nữa nếu chúng tôi muốn bằng cách thêm bí danh vào tất cả các cột được chèn:

1

2

3

4

5

6

7

8

9

10

CHÈN

VÀO

dbo

.

tài khoản

(

account_name

,

account_start_date

,

account_address

,

account_type

,

account_create_timestamp

,

account_notes

,

is_active

)

CHỌN

‘Microsoft’

AS

account_name

,

‘4 / 4/1975 ‘

AS

account_start_date

,

‘One Microsoft Way in Redmond, Washington’

AS

account_address < / p>

,

‘TRỰC TIẾP’

NHƯ

account_type

,

NHẬN NGÀY

(

)

NHƯ

account_start_date

,

‘Họ tạo ra SQL Server. Cảm ơn! ‘

AS

account_notes

,

1

AS

is_active

;

Thêm bí danh cột có vẻ như quá mức cần thiết, nhưng khi làm việc với các câu lệnh INSERT dài hơn, SQL động hoặc các truy vấn phức tạp, tài liệu được thêm vào có thể hỗ trợ rất nhiều trong việc viết, sửa đổi và gỡ rối các truy vấn đó. Bạn cũng có thể kiểm tra câu lệnh chèn của mình bằng cách chỉ đánh dấu danh sách CHỌN và thực thi nó, nó trả về các giá trị cùng với các tiêu đề cột tiện dụng:

Ngoài ra, bạn có thể cung cấp tài liệu đó trong các nhận xét:

1

2

3

4

5

6

7

8

9

10

CHÈN

VÀO

dbo

.

tài khoản

(

account_name

,

account_start_date

,

account_address

,

account_type

,

account_start_date

,

account_notes

,

is_active

)

CHỌN

‘Microsoft ‘

,

– account_name

‘4/4/1975’

,

– account_start_date

‘One Microsoft Way ở Redmond, Washington’

,

– account_address

‘TRỰC TIẾP’ < / p>

,

– account_type

GETUTCDATE

(

)

,

– account_start_date

‘Họ tạo ra SQL Server. Cảm ơn! ‘

,

– account_notes < / p>

1

;

– is_active

Đây có thể là một cách hay để lập tài liệu mà không cần điều chỉnh truy vấn. Nhược điểm duy nhất là bạn mất các tên cột tiện dụng đã được trình bày ở trên với bài kiểm tra SELECT. Cả hai đều đáng thêm 30 giây để đưa vào mã của bạn vì chúng sẽ tiết kiệm nhiều thời gian hơn trong tương lai khi đến lúc sửa đổi hoặc khắc phục sự cố mã đó.

Chèn dữ liệu vào SQL Server với CHỌN VÀO

Có thể tạo một đối tượng bảng mới và CHỌN dữ liệu vào đó như một phần của một câu lệnh. Đây có thể là một cách thuận tiện để tránh rắc rối khi xác định bảng từ trước và liệt kê tên cột. Thông thường, điều này được sử dụng để điền các bảng tạm thời, nhưng nó có thể được sử dụng cho các bảng vĩnh viễn nếu một kịch bản yêu cầu nó. SELECT INTO có thể không được sử dụng để tự động tạo các biến bảng.

Truy vấn dưới đây cho biết cách chúng tôi có thể hoàn thành nhiệm vụ này một cách nhanh chóng và hiệu quả:

1

2

3

4

5

6

CHỌN

‘Ed Pollack’

NHƯ

developer_name

,

‘SQL Server 2019 CTP1’

NHƯ

database_engine_of_choice

,

‘Pizza’

AS

food_choice

,

10

NHƯ

Cay_level

VÀO

#

developer_info

;

Khi được thực thi, một bảng tạm thời sẽ được tạo nhanh chóng với các tên cột được cung cấp. Khi chúng tôi truy vấn bảng, chúng tôi nhận được kết quả sau:

Các kiểu dữ liệu cho các cột được SQL Server chọn tự động. Chúng tôi có thể xác minh chúng bằng cách truy vấn TempDB như sau:

1

2

3

4

5

6

7

8

9

10

11

CHỌN

bảng

.

name

AS < / p>

Tên bảng

,

cột < / p>

.

tên

NHƯ

ColumnName

,

cột

.

max_length

NHƯ

ColumnLength

,

các loại

.

tên

NHƯ

Tên chữ

< / p>

TỪ

TempDB

.

sys

.

bảng

INNER

THAM GIA

TempDB

.

sys

.

cột

BẬT

bảng

.

object_id

=

cột

.

object_id

INNER

THAM GIA

TempDB

.

sys

.

loại

BẬT

loại < / p>

.

user_type_id

=

cột

.

user_type_id

WHERE

bảng

.

tên

THÍCH

‘# developer_info%’

;

< / p>

Kết quả hiển thị các cột có kích thước để đáp ứng nhu cầu tối thiểu của dữ liệu mà tôi đã chèn:

Nếu tôi đã chèn nhiều hàng, thì kích thước cột sẽ khớp với kích thước nhỏ nhất cần thiết để vừa với tất cả dữ liệu đó. Điều này rất tiện lợi khi giả sử rằng sau này chúng ta không cần thêm dữ liệu bổ sung vào bảng tạm thời. Nếu làm vậy, chúng tôi cần đảm bảo rằng dữ liệu mới không vượt quá kích thước cột đã được xác định.

Cú pháp SELECT INTO cung cấp một sự tiện lợi rất lớn khi chúng ta muốn chèn dữ liệu vào một bảng có thể khác nhau rất nhiều từ việc thực thi đến thực thi hoặc có thể trải qua các thay đổi lược đồ thường xuyên đủ để làm cho việc duy trì danh sách cột trở nên khó khăn.

Bạn có thể kiểm soát các loại dữ liệu nếu bạn muốn. Hãy lặp lại ví dụ của chúng tôi ở trên bằng cách sử dụng TSQL sau:

1

2

3

4

5

6

CHỌN

CAST

(

‘Ed Pollack’

NHƯ

VARCHAR

(

50

)

)

AS

developer_name < / p>

,

CAST

(

‘ SQL Server 2019 CTP1 ‘

AS

VARCHAR

(

30

)

)

NHƯ

database_engine_of_choice

,

CAST

(

‘Pizza’

NHƯ

BIẾN HÌNH

(

25

)

)

NHƯ

food_choice

,

CAST

(

10

NHƯ

QUYẾT ĐỊNH < / p>

(

5

,

2

)

)

NHƯ

Cay_level

VÀO

#

developer_info

;

Khi chúng tôi tham khảo ý kiến ​​của các chế độ xem hệ thống, chúng tôi có thể xác nhận rằng các loại dữ liệu đã được xác định như chúng tôi muốn và không phải là kích thước tối thiểu cần thiết để hỗ trợ dữ liệu mà tôi đã tạo:

Xem Thêm  How to Solve Python TypeError: not all arguments converted during string formatting - not all arguments converted during string formatting

Nhược điểm chính của việc sử dụng cú pháp SELECT INTO là bảng kết quả sẽ không có chỉ mục hoặc ràng buộc nào được xác định trên đó. Nếu cần có bất kỳ cấu trúc bổ sung nào cho bảng, thì cấu trúc đó sẽ cần được thêm vào sau thực tế. Đối với các trường hợp không cần điều này, thì SELECT INTO cung cấp một cú pháp rất nhanh và thuận tiện có thể rút ngắn mã và cải thiện khả năng bảo trì bằng cách giảm số lượng vị trí yêu cầu thay đổi khi lược đồ hoặc định nghĩa cơ bản của dữ liệu bị thay đổi.

SELECT INTO cũng có thể được sử dụng cho một câu lệnh SELECT chung chung không có định nghĩa bổ sung, chẳng hạn như sau:

1

2

3

4

CHỌN

*

VÀO

dbo

.

account_backup

< p class = "crayon-line" id = "urvanov-cú pháp-highlighter-62b140742ab85369614904-4">

TỪ

dbo

.

tài khoản

;

Trong một câu lệnh TSQL rất ngắn, chúng tôi đã tạo một bảng vĩnh viễn mới và chèn tất cả nội dung của dbo.account vào đó. Lưu ý rằng khi cú pháp này được sử dụng, các kiểu dữ liệu trong bảng kết quả sẽ khớp với bảng nguồn vì chúng hiện được xác định.

Chèn Máy chủ SQL Dữ liệu qua Thủ tục Đã Lưu trữ hoặc SQL Động

Các thủ tục được lưu trữ thường được sử dụng để trả về dữ liệu cho các ứng dụng, báo cáo hoặc các tập lệnh TSQL bổ sung để xử lý. Kết quả của bất kỳ quy trình được lưu trữ nào có thể được chèn trực tiếp vào một bảng được xác định trước như sau:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

TẠO

BẢNG

#

temp

(

< / p>

SPID

VARCHAR

(

100

)

,

TRẠNG THÁI

VARCHAR

(

100

)

,

ĐĂNG NHẬP

< p class = "crayon-h">

VARCHAR

(

100

)

,

tên máy chủ

BIẾN HÌNH

(

100 < / p>

)

,

blkby

< / p>

VARCHAR

(

100

)

,

dbname

BIẾN HÌNH

(

100

)

,

lệnh

BIẾN HÌNH

(

100

)

,

cputime

VARCHAR

(

100

)

,

diskit

BIẾN HÌNH

(

100

)

,

latbatch

BIẾN HÌNH

(

100

)

,

tên chương trình

VARCHAR

(

100

)

,

spid2

VARCHAR

< p class = "crayon-sy"> (

100

)

,

suggest

VARCHAR

(

100

)

)

CHÈN

VÀO

#

tạm thời

THỰC HIỆN

sp_who2

;

CHỌN

*

TỪ

#

temp

WHERE

dbname

=

< p class = "crayon-s"> ‘AdventureWorks2016CTP3’

;

DROP

BẢNG

#

temp

;

Tập lệnh giám sát này sẽ thực thi sp_who2 để trả về danh sách các quy trình hiện tại trong cơ sở dữ liệu nhất định. Theo mặc định, thủ tục được lưu trữ này trả về tất cả các phiên, mặc dù các tham số có thể được cung cấp để lọc theo thông tin đăng nhập hoặc ID phiên. Tuy nhiên, để lọc theo cơ sở dữ liệu, sẽ yêu cầu trả lại tất cả dữ liệu và sau đó loại bỏ các hàng không liên quan theo cách thủ công. Bằng cách tạo một bảng tạm thời ở phía trước và chèn kết quả trực tiếp vào nó, sau đó chúng ta có thể tự do lọc kết quả được đặt theo bất kỳ tiêu chí nào chúng ta muốn. Bất kỳ bảng nào cũng có thể được sử dụng cho mục đích này, bao gồm các bảng vĩnh viễn, cũng như các biến bảng.

Cú pháp tương tự có thể được sử dụng để chèn kết quả của SQL động vào một bảng, như sau:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

KHAI BÁO

@

sql_command

NVARCHAR

(

MAX

)

;

KHAI BÁO

@

account_type

SYSNAME

=

‘TRỰC TIẾP’

;

CHỌN < / p>

@

sql_command

=

CHỌN

account_id

TỪ dbo .account

WHERE account_type = ‘

+

@

account_type

+

< p class = "crayon-s"> ‘;’

;

TẠO

BẢNG

#

id_list

< p class = "crayon-line" id = "urvanov-cú pháp-highlighter-62b140742ab87059051396-9">

(

account_id

INT

KHÔNG

KHÔNG < / p>

CHÍNH THỨC

KEY

ĐÃ CHỈNH SỬA

)

;

CHÈN

< / p>

VÀO

#

id_list

(

account_id

< p class = "crayon-sy">)

THỰC HIỆN

sp_executesql

< p class = "crayon-sy"> @

sql_command

;

CHỌN

*

TỪ

#

id_list

;

DROP

BẢNG

#

id_list

;

Kết quả cuối cùng của đoạn mã này là chúng ta sử dụng sp_executesql để thực thi SQL động, đặt kết quả trực tiếp vào một bảng tạm thời.

Trong cả hai trường hợp này, chúng tôi có thể thực thi TSQL thủ tục và chèn kết quả trực tiếp vào bảng hiện có. SELECT INTO không được hỗ trợ với cú pháp này, nhưng mọi thứ khác mà chúng ta đã thảo luận cho đến nay đều hoạt động với quy ước này.

Chèn Máy chủ SQL Dữ liệu có CHÈN ĐẦU RA

Một cách bổ sung mà chúng tôi có thể tạo dữ liệu là thông qua một câu lệnh hiện có. Khi chúng tôi thực hiện bất kỳ thao tác ghi nào, chúng tôi có thể xuất dữ liệu từ trước hoặc sau khi thay đổi sang một bảng khác. Đây là một ví dụ về cách nó trông như thế nào:

1

2

3

4

5

6

7

8

9

10

11

12

13

TẠO

BẢNG

#

account_ids

(< / p>

account_id

INT

KHÔNG

KHÔNG CÓ

CHÍNH

KEY

ĐÃ CHỈNH SỬA

)

;

< / p>

CẬP NHẬT

tài khoản

BỘ

is_active

=

1

ĐẦU RA

ĐÃ CHÈN

.

account_id

VÀO

< p class = "crayon-h">

#

account_ids

TỪ

dbo

.

tài khoản

WHERE

account_type

=

‘TRỰC TIẾP’

;

CHỌN

*

TỪ < / p>

#

account_ids

;

THẢ

BẢNG

#

account_ids

;

Mục tiêu ở trên là cập nhật tất cả các tài khoản thuộc loại “TRỰC TIẾP” để hoạt động. Chúng tôi cũng muốn trả lại account_id cho mỗi tài khoản đã được cập nhật. Sử dụng OUTPUT INSERTED cho phép chúng tôi hoàn thành cả hai nhiệm vụ trong một giải pháp dựa trên bộ duy nhất. Kết quả cho chúng tôi biết những ID nào bị ảnh hưởng bởi tuyên bố cập nhật:

INSERTED sẽ chứa tất cả các cột trong bảng khi chúng xuất hiện sau khi áp dụng các thay đổi. Tương tự, DELETED sẽ chứa các phiên bản trước đó. Chúng tôi có thể trộn và kết hợp những thứ này để có hiệu quả tối đa:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

TẠO

BẢNG

#

account_ids

(< / p>

account_id

INT

KHÔNG

KHÔNG CÓ

CHÍNH

KEY

ĐÃ CHỈNH SỬA

,

is_active_previous

BIT

KHÔNG

KHÔNG ĐỦ

,

is_active_current

BIT

KHÔNG

< p class = "crayon-k"> KHÔNG ĐỦ

)

;

CẬP NHẬT

tài khoản

BỘ

is_active

=

0

ĐẦU RA

ĐÃ CHÈN

.

account_id

,

ĐÃ XÓA

.

is_active

,

ĐÃ CHÈN

.

is_active

VÀO

#

account_ids

TỪ

dbo

.

tài khoản

WHERE

account_type

< / p>

=

‘TRỰC TIẾP’

< p class = "crayon-sy">;

CHỌN

*

TỪ

#

account_ids

;

DROP

BẢNG

# < p class = "crayon-i"> account_ids

;

Kết quả cho thấy rằng chúng tôi không chỉ nắm bắt các ID tài khoản mà còn cả các giá trị trước đó và giá trị mới cho cờ is_active. Đây là một sự tiện lợi rất lớn vì chúng ta có thể sử dụng OUTPUT INSERTED trong các câu lệnh INSERT, DELETE, UPDATE và MERGE để nhanh chóng kéo trước & amp; sau khi dữ liệu để sử dụng trong quá trình xử lý bổ sung.

Đây là một giải pháp vượt trội hơn nhiều so với việc lặp lại và / hoặc sử dụng SCOPE_IDENTITY () và là cách dễ dàng duy nhất để thu thập dữ liệu theo kiểu này với rất ít mã. OUTPUT INSERTED là một phương pháp tuyệt vời để nhận được trước & amp; sau dữ liệu từ các câu lệnh DML. Nó cũng hữu ích để thu thập danh sách các hàng đã được thay đổi trong một câu lệnh TSQL nhất định, vì vậy chúng tôi có thể thực hiện các hành động bổ sung hoặc báo cáo về chúng nếu cần.

Phương pháp nào là tốt nhất?

Với nhiều phương pháp chèn dữ liệu vào SQL Server hiện có, câu hỏi đầu tiên chúng ta sẽ đặt ra là chúng ta nên sử dụng cú pháp nào? Câu trả lời sẽ phụ thuộc vào trường hợp sử dụng của bạn và cụ thể điều gì là quan trọng nhất đối với một ứng dụng nhất định. Để tóm tắt công việc của chúng tôi cho đến nay:

Xem Thêm  Lập trình đa luồng trong Java (Java Multi-threading) - da luong trong java

Sử dụng CHÈN với danh sách cột rõ ràng cho các ứng dụng mà danh sách cột, đầu vào và đầu ra không thay đổi thường xuyên. Đây là những tình huống mà sự thay đổi thường bao gồm các bổ sung hoặc thay đổi cột do các bản phát hành phần mềm. Danh sách cột cũng thêm một lớp bảo vệ chống lại các lỗi lôgic nếu một cột được thêm, bớt hoặc thay đổi mà không có câu lệnh INSERT cũng được cập nhật. Một lỗi được đưa ra là một kết quả tốt hơn nhiều so với việc dữ liệu được xử lý không chính xác một cách lặng lẽ. Cú pháp này thường được coi là một phương pháp hay nhất vì nó cung cấp cả tài liệu và khả năng bảo vệ khỏi những sai lầm vô tình nếu lược đồ thay đổi trong tương lai.

INSERT không có danh sách cột tạo ra một vị trí thích hợp trong các tình huống mà các cột không xác định hoặc thường xuyên thay đổi. Điều này có thể hữu ích trong ETL, báo cáo hoặc các tình huống liên quan đến dữ liệu tạm thời khi dữ liệu không có cấu trúc. Mặc dù ứng dụng có thể xảy ra, tôi sẽ hướng tới việc sử dụng CHỌN INTO cho các ứng dụng này vì chúng cung cấp sự an toàn hơn một chút trước những sai lầm vô ý với dữ liệu của bạn. Một giải pháp thay thế để giải quyết nhu cầu chèn vào bảng có sẵn sẽ là sử dụng SELECT INTO để tạo cấu trúc dữ liệu tạm thời và sau đó chèn từ dữ liệu tạm thời đó vào bảng vĩnh viễn bằng cách sử dụng danh sách cột chính thức.

SELECT INTO cung cấp cho chúng tôi khả năng nhanh chóng tạo một bảng mới và kết xuất dữ liệu vào đó với rất ít thiết lập hoặc mã hóa. Đối với các tập dữ liệu nhỏ hoặc những tập dữ liệu sẽ được quét toàn bộ, đây là một cách tuyệt vời để di chuyển dữ liệu với TSQL và bảo trì tối thiểu. Nhược điểm chính là không thể bao gồm các chỉ mục hoặc ràng buộc trên bảng cho đến khi nó được tạo. Cú pháp này phải tạo một bảng mới, bảng này cho phép sử dụng các bảng tạm thời làm mục tiêu để chèn dữ liệu vào.

OUTPUT INSERTED cho phép chúng tôi trả về dữ liệu từ trước, sau hoặc trước và sau một câu lệnh DML. Đây là một cú pháp cực kỳ hữu ích và không có nhược điểm nội tại. Nó là một sự thay thế tuyệt vời cho việc lặp lại, các chức năng hoặc trình kích hoạt có thể cố gắng hoàn thành các nhiệm vụ tương tự. Cú pháp tương đối đơn giản và có thể được áp dụng cho bất kỳ phần tử dữ liệu nào trước hoặc sau một thay đổi nhất định. Bạn thậm chí có thể bao gồm dữ liệu không bị ảnh hưởng trực tiếp bởi câu lệnh DML, nhưng đã được kết hợp để sử dụng trong truy vấn!

Kết luận

Có nhiều cách để chèn dữ liệu vào SQL Server, nhưng không phải tất cả đều như nhau. Chọn đúng cú pháp có thể có tác động đáng kể đến hiệu suất, tài liệu và khả năng bảo trì. Bài viết này cung cấp sự so sánh của nhiều cú pháp, cũng như ưu, nhược điểm và bản trình diễn của từng cú pháp.

Luôn xem xét ứng dụng của bạn khi viết mã và điều chỉnh phong cách của bạn dựa trên tần suất lược đồ và mã dự kiến ​​sẽ thay đổi. Lược đồ và các ứng dụng tĩnh và hiếm khi thay đổi có thể có các câu lệnh INSERT được mã hóa cứng với các cột, bí danh và / hoặc tài liệu tham khảo để giúp chúng dễ đọc và dễ bảo trì.

Đối với các nhu cầu về lược đồ hoặc công việc thường xuyên thay đổi, CHỌN VÀO hoặc bỏ qua danh sách cột khỏi CHÈN có thể cho phép tính linh hoạt hơn ở những nơi mà mã sẽ được hưởng lợi rất nhiều từ nó.

Có nhiều tùy chọn theo ý của chúng tôi cho phép chúng tôi đưa ra quyết định tốt hơn khi cần các lựa chọn thông minh và sẽ giúp chúng tôi viết mã tốt hơn, điều này sẽ khiến các nhà phát triển trong tương lai đánh giá cao chúng tôi hơn nhiều khi nó được cập nhật và duy trì!

Tài liệu tham khảo và Đọc thêm

  • Tham chiếu MSDN cho OUTPUT INSERTED và việc sử dụng chung mệnh đề OUTPUT
  • Các bản trình diễn về cách sử dụng chế độ xem danh mục hệ thống từ tài liệu của Microsoft
  • Tài liệu mở rộng của Microsoft về câu lệnh INSERT


Xem thêm những thông tin liên quan đến chủ đề cách thêm dữ liệu vào sql

Creating tables and adding data in Microsoft SQL Server – using GUI and T-SQL code

  • Tác giả: SQL Server 101
  • Ngày đăng: 2021-05-12
  • Đánh giá: 4 ⭐ ( 1927 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: In this video, we will create a database and two tables and add data into those tables.
    Want more? My SQL Server Udemy courses are:
    70-461, 70-761 Querying Microsoft SQL Server with T-SQL: https://rebrand.ly/querying-microsoft-sql-server
    98-364: Database Fundamentals (Microsoft SQL Server): https://rebrand.ly/database-fundamentals
    70-462 SQL Server Database Administration (DBA): https://rebrand.ly/sql-server-dba
    Microsoft SQL Server Reporting Services (SSRS): https://rebrand.ly/sql-server-ssrs
    SQL Server Integration Services (SSIS): https://rebrand.ly/sql-server-ssis
    SQL Server Analysis Services (SSAS): https://rebrand.ly/sql-server-ssas-mdx
    Microsoft Power Pivot (Excel) and SSAS (Tabular DAX model): https://rebrand.ly/microsoft-powerpivot-ssas-tabular-dax
    —-
    We will be creating tables using the GUI (Graphic User Interface) and using the CREATE TABLE syntax.
    We will then be adding data using the “Edit Top 200 rows”, and then using the INSERT … VALUES syntax.

Thêm dữ liệu vào MySQL trong PHP

  • Tác giả: comdy.vn
  • Đánh giá: 3 ⭐ ( 8670 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hướng dẫn này sẽ giúp bạn tìm hiểu cách thêm dữ liệu vào MySQL sử dụng MySQLi và PDO trong PHP.

Thêm Dữ Liệu vào Database

  • Tác giả: www.codehub.com.vn
  • Đánh giá: 3 ⭐ ( 3203 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Phần này chúng ta sẽ thực hiện việc thêm vào bảng `students` danh sách 3 học viên và bảng `teachers` 1 giảng viên.

Thêm một kết nối dữ liệu vào cơ sở dữ liệu Microsoft SQL Server

  • Tác giả: support.microsoft.com
  • Đánh giá: 5 ⭐ ( 2078 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

SQLite và cách thêm dữ liệu

  • Tác giả: edu.com.vn
  • Đánh giá: 3 ⭐ ( 1604 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

One moment, please…

  • Tác giả: tinhoc88.com
  • Đánh giá: 4 ⭐ ( 7347 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Thêm dữ liệu trong SQL với Insert Into

  • Tác giả: shareprogramming.net
  • Đánh giá: 3 ⭐ ( 1668 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Mã lệnh Insert Into trong SQL được sử dụng để thêm một dòng dữ liệu trong một bảng. Chúng ta có 2 cách sử dụng Insert Into trong SQL

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

By ads_php