Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

PARSE () so với CAST () so với CONVERT () trong SQL Server:Sự khác biệt là gì?

Có lẽ bạn đã gặp T-SQL PARSE() , CAST()CONVERT() khi làm việc với SQL Server và tự hỏi sự khác biệt là gì. Cả ba chức năng này dường như hoạt động giống nhau, nhưng có sự khác biệt nhỏ giữa chúng.

Trong bài viết này, tôi muốn phác thảo những điểm khác biệt chính giữa các chức năng này.

So sánh

Dưới đây là bảng phác thảo những điểm khác biệt chính giữa CONVERT() , CAST()PARSE() các chức năng trong SQL Server:

CONVERT () CAST () PARSE ()
Định nghĩa chính thức Chuyển đổi một biểu thức của một kiểu dữ liệu này sang một kiểu dữ liệu khác. Chuyển đổi một biểu thức của một kiểu dữ liệu này sang một kiểu dữ liệu khác. Trả về kết quả của một biểu thức, được dịch sang kiểu dữ liệu được yêu cầu trong SQL Server.
Giá trị được chấp nhận Bất kỳ biểu thức hợp lệ nào. Bất kỳ biểu thức hợp lệ nào. Chuỗi.
Giá trị trả lại Đối số thứ 2, được dịch sang kiểu dữ liệu được yêu cầu như được cung cấp bởi đối số thứ nhất. Đối số thứ nhất, được dịch sang kiểu dữ liệu được yêu cầu như được cung cấp bởi đối số thứ hai. Đối số thứ nhất, được dịch sang kiểu dữ liệu được yêu cầu như được cung cấp bởi đối số thứ hai.
Chuyển đổi được Hỗ trợ Giữa hai kiểu dữ liệu bất kỳ. Giữa hai kiểu dữ liệu bất kỳ. Chỉ từ chuỗi đến ngày / giờ và các loại số.
Chấp nhận phong cách Lập luận? Có. Không. Không.
Chấp nhận văn hóa Lập luận? Không. Không. Có.
Yêu cầu .NET Framework? Không. Không. Có.

Một số điểm khác ngoài bảng trên:

  • Tài liệu của Microsoft chỉ ra rằng PARSE() sẽ không được điều khiển từ xa (vì nó phụ thuộc vào sự hiện diện của CLR). Việc khởi động lại một chức năng yêu cầu CLR sẽ gây ra lỗi trên máy chủ từ xa.
  • Có một số giá trị PARSE() có thể đối phó với nhưng CAST()CONVERT() không được (ví dụ:chuỗi sử dụng các định dạng ngày nhất định).
  • CAST() được bao gồm trong tiêu chuẩn ANSI SQL-92.
  • Một số người cho rằng CAST() có hiệu suất tốt hơn hai phần còn lại.
  • Có một chi phí hiệu suất nhất định khi phân tích cú pháp các giá trị chuỗi. Do đó, PARSE() thường sẽ chạy chậm hơn hai cái còn lại.

Dưới đây là các ví dụ về các tình huống mà mỗi chức năng sẽ phù hợp nhất.

Khi nào sử dụng CAST ()

Một đối số tốt có thể được đưa ra để sử dụng CAST() cho bất kỳ trường hợp nào không được liệt kê bên dưới. Như đã đề cập, CAST() đã là một phần của tiêu chuẩn ANSI SQL kể từ SQL-92, vì vậy nó phải linh hoạt hơn giữa các DBMS khác nhau (nếu đó là một yêu cầu).

Ngoài ra, một số người cho rằng CAST() có hiệu suất tốt hơn hai chức năng kia (đây là một bài viết thú vị so sánh hiệu suất giữa cả ba chức năng).

Tuy nhiên, cũng có những lý do hợp lệ mà bạn có thể thích (hoặc cần) sử dụng CONVERT() over CAST() .

Khi nào sử dụng CONVERT ()

CONVERT() chức năng có thể hữu ích khi bạn cần sử dụng style để chỉ định cách định dạng ngày khi chuyển đổi giữa ngày và chuỗi. Dưới đây là một số ví dụ:

DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677';
SELECT
    CONVERT(nvarchar(30), @date, 100) AS '100',
    CONVERT(nvarchar(30), @date, 101) AS '101',
    CONVERT(nvarchar(30), @date, 102) AS '102',
    CONVERT(nvarchar(30), @date, 103) AS '103';

Kết quả:

+---------------------+------------+------------+------------+
| 100                 | 101        | 102        | 103        |
|---------------------+------------+------------+------------|
| Jun  7 2018  2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 |
+---------------------+------------+------------+------------+

Bạn chỉ có thể thực hiện việc này với CONVERT() bởi vì:

  • CAST() không hỗ trợ style lý lẽ; và
  • PARSE() không chuyển đổi từ ngày / giờ thành giá trị chuỗi (nó cũng không hỗ trợ kiểu style tranh luận)

Khi nào sử dụng PARSE ()

Mặc dù có nhiều nhược điểm khác nhau của chức năng này (hiệu suất, sự phụ thuộc vào .NET, hạn chế chuyển đổi kiểu dữ liệu), nó cũng có một số ưu điểm và có một số trường hợp mà nó có thể là sự lựa chọn duy nhất của bạn. Ví dụ:khi cung cấp một ngày bao gồm tên các ngày trong tuần, chẳng hạn như Thứ Sáu, ngày 20 tháng 7 năm 2018 .

Khi những người khác trả lại lỗi

Dưới đây là các ví dụ trong đó PARSE() là hàm duy nhất trong ba hàm có thể chuyển đổi giá trị thành công mà không gặp lỗi.

Trong các ví dụ này, chúng tôi cố gắng chuyển đổi các giá trị chuỗi khác nhau thành ngày loại dữ liệu. Tuy nhiên, các giá trị chuỗi chúng tôi cung cấp bao gồm tên ngày trong tuần. Điều này gây ra sự cố cho CAST()CONVERT() , nhưng PARSE() không có vấn đề gì.

PARSE ()

SELECT 
    PARSE('Friday, 20 July 2018' AS date) AS 'Result 1',
    PARSE('Fri, 20 July 2018' AS date) AS 'Result 2',
    PARSE('Friday 20 July 2018' AS date) AS 'Result 3';

Kết quả:

+------------+------------+------------+
| Result 1   | Result 2   | Result 3   |
|------------+------------+------------|
| 2018-07-20 | 2018-07-20 | 2018-07-20 |
+------------+------------+------------+

Vì vậy, PARSE() không có vấn đề gì với định dạng của ngày mà chúng tôi cung cấp.

CHUYỂN ĐỔI ()

SELECT 
    CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1',
    CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2',
    CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';

Kết quả:

Conversion failed when converting date and/or time from character string.

Vì vậy, CONVERT() không thể chuyển đổi chuỗi khi ở định dạng như vậy.

CAST ()

SELECT 
    CAST('Friday, 20 July 2018' AS date) AS 'Result 1',
    CAST('Fri, 20 July 2018' AS date)AS 'Result 2',
    CAST('Friday 20 July 2018' AS date) AS 'Result 3';

Kết quả:

Conversion failed when converting date and/or time from character string.

CAST() trả về cùng một lỗi.

Vì vậy, nếu bạn thấy mình gặp lỗi với hai hàm còn lại, hãy thử PARSE() thay vào đó.

Đặc tả văn hóa

Một tình huống khác mà bạn có thể thích sử dụng PARSE() là khi chỉ định văn hóa / ngôn ngữ mà chuỗi được cung cấp. PARSE() có một đối số tùy chọn cho phép bạn chỉ định nền văn hóa nào sẽ sử dụng. Nếu bị bỏ qua, ngôn ngữ của phiên hiện tại sẽ được sử dụng.

Ví dụ về việc bao gồm culture đối số:

SELECT 
    PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1',
    PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';

Kết quả:

+------------+------------+
| Result 1   | Result 2   |
|------------+------------|
| 2018-07-01 | 2018-01-07 |
+------------+------------+

Một nền văn hóa thay thế

Mặc dù lợi ích của việc có thể chỉ định văn hóa với PARSE() , bạn có khả năng thay đổi cài đặt ngôn ngữ, có nghĩa là bạn có thể đạt được hiệu quả tương tự khi sử dụng CAST() hoặc CONVERT() .

Ví dụ:sử dụng SET LANGUAGE us_english trước truy vấn sẽ thay đổi cài đặt ngôn ngữ hiện tại thành us_english . Mặc dù điều này không cho phép bạn chỉ định các nền văn hóa khác nhau trong truy vấn (như trong ví dụ trên), nhưng nó ảnh hưởng đến toàn bộ truy vấn (và mọi truy vấn tiếp theo).

Bạn cũng có thể thay đổi cài đặt định dạng ngày theo cách tương tự. Ví dụ:SET DATEFORMAT mdy .

Dưới đây là ví dụ về việc thay đổi cài đặt ngôn ngữ trước khi chạy truy vấn với CAST()CONVERT() :

Tiếng Đức:

SET LANGUAGE German;
SELECT CONVERT(date, '07/01/2018') AS 'Convert';
SELECT CAST('07/01/2018' AS date) AS 'Cast';

Kết quả:

+------------+
| Convert    |
|------------|
| 2018-01-07 |
+------------+
Die Spracheneinstellung wurde in Deutsch geändert.
+------------+
| Cast       |
|------------|
| 2018-01-07 |
+------------+

us_english:

SET LANGUAGE us_english;
SELECT CONVERT(date, '07/01/2018') AS 'Convert';
SELECT CAST('07/01/2018' AS date) AS 'Cast';

Kết quả:

+------------+
| Convert    |
|------------|
| 2018-07-01 |
+------------+
Changed language setting to us_english.
+------------+
| Cast       |
|------------|
| 2018-07-01 |
+------------+

Hãy nhớ rằng khi bạn làm điều này, bạn đang thay đổi môi trường định dạng ngôn ngữ / ngày cho phiên. Đừng quên thay đổi lại nó!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép cơ sở dữ liệu SQL Server

  2. Các cột ngày tháng trong SQL-Server (MSSQL-JDBC 3.0) chạy trong Java 1.7.0 được truy xuất là 2 ngày trước đây

  3. Sử dụng FILEGROUP_NAME () để trả lại tên của nhóm tệp trong SQL Server

  4. Phát triển máy ảo Azure để sử dụng máy chủ SQL

  5. Chuyển một varchar chứa đầy các giá trị được phân tách bằng dấu phẩy vào hàm SQL Server IN