2010-08-30 58 views
18

Câu trả lời này với những gì trông giống như cùng một câu hỏi:MS SQL server - chuyển đổi chuỗi HEX để nguyên

Convert integer to hex and hex to integer

..does không làm việc cho tôi.

Tôi không thể đi đến chuỗi HEX đến số nguyên bằng cách sử dụng MS SQL server 2005 CAST hoặc CONVERT. Tôi có thiếu cái gì tầm thường? Tôi đã tìm kiếm rộng rãi, và tốt nhất mà tôi có thể tìm thấy là các hàm người dùng có độ dài dài để đi từ một giá trị chuỗi hex đến một cái gì đó trông giống như một số thập phân int. Chắc chắn có một cách đơn giản để làm điều này trực tiếp trong một truy vấn bằng cách sử dụng các hàm dựng sẵn thay vì viết một hàm người dùng?

Cảm ơn

Chỉnh sửa để bao gồm ví dụ:

chọn CONVERT (INT, 0x89)

công trình như mong đợi, nhưng

chọn CONVERT (INT, ' Chuỗi con 0x '+ (msg, 66, 2)) từ somet2

giúp tôi:

"Chuyển đổi không thành công khi chuyển đổi giá trị varchar '0x89' thành kiểu dữ liệu int."

một CAST rõ ràng thêm:

chọn CONVERT (INT, CAST ('0x89' AS VARBINARY))

thực thi, nhưng trả 813185081.

thay thế 'Int', 'Thập phân', v.v. đối với 'Biến thể' dẫn đến lỗi. Nói chung, các chuỗi có vẻ là số được hiểu là số nếu được yêu cầu, nhưng không phải trong trường hợp này và có vẻ như không phải là một CAST nhận dạng HEX. Tôi muốn nghĩ rằng có một cái gì đó đơn giản và rõ ràng và tôi đã bỏ lỡ nó.

Microsoft SQL Server Management Studio Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) ngày 06 tháng chín năm 2009 1:43:32 Bản quyền (c) 1988-2005 Microsoft Corporation Express Edition với các dịch vụ nâng cao trên Windows NT 5.1 (Bản dựng 2600: Gói dịch vụ 3)

Tóm lại: Tôi muốn lấy một chuỗi hex là một giá trị trong bảng và hiển thị nó như một phần của kết quả truy vấn một số nguyên thập phân, chỉ sử dụng các hàm được hệ thống xác định, chứ không phải UDF.

+1

Bạn có gặp phải lỗi cụ thể hoặc kết quả không mong muốn không? Ví dụ sẽ hữu ích. – LittleBobbyTables

+0

"Không có nghĩa là gì"? CONVERT() là một hàm dựng sẵn và rất khó có khả năng nó không hoạt động. Vì vậy, hãy đăng phiên bản và ấn bản MSSQL của bạn, cộng với kết quả chạy hai truy vấn SELECT từ câu trả lời bạn đã liên kết đến: SELECT CONVERT (VARBINARY (8), 16777215) và SELECT CONVERT (INT, 0xFFFFFF) – Pondlife

+0

Bạn đã thấy điều này chưa? Xem các bình luận ... http://blog.sqlauthority.com/2010/02/01/sql-server-question-how-to-convert-hex-to-decimal/ –

Trả lời

30

Cảm ơn bạn đã đưa ra một số ví dụ rõ ràng hơn. Theo như tôi có thể nói từ các tài liệu và Googling, điều này là không thể trong MSSQL 2005 mà không có một UDF hoặc mã thủ tục khác.Trong MSSQL 2008 tham số phong cách các CONVERT() chức năng bây giờ supoprts dữ liệu nhị phân, vì vậy bạn có thể làm điều đó trực tiếp như thế này:

select convert(int, convert(varbinary, '0x89', 1)) 

Trong các phiên bản trước đó, sự lựa chọn của bạn là:

  • Sử dụng một UDF (TSQL hoặc CLR; CLR thực sự có thể dễ dàng hơn cho việc này)
  • Quấn SELECT theo thủ tục được lưu trữ (tuy nhiên, bạn vẫn có thể vẫn tương đương với UDF trong đó)
  • Chuyển đổi nó trong giao diện người dùng ứng dụng
  • Nâng cấp lên MSSQL 2008

Nếu chuyển đổi dữ liệu chỉ dành cho mục đích hiển thị, ứng dụng có thể là giải pháp dễ nhất: dữ liệu định dạng thường thuộc có anyway. Nếu bạn phải làm điều đó trong một truy vấn, thì một UDF là dễ nhất nhưng hiệu năng có thể không tuyệt vời (tôi biết bạn nói bạn không thích sử dụng UDF nhưng không rõ tại sao). Tôi đoán rằng việc nâng cấp lên MSSQL 2008 chỉ vì điều này có lẽ không thực tế.

Cuối cùng, số phiên bản mà bạn đã đưa vào là phiên bản của Management Studio, không phải là số phiên bản của máy chủ của bạn. Để nhận được điều đó, hãy truy vấn chính máy chủ với select @@version hoặc select serverproperty('ProductVersion').

+0

Cảm ơn và cảm ơn vì đã làm cho tôi làm rõ câu hỏi của tôi. Tôi đã tìm kiếm các thông số về kiểu cho phiên bản Chuyển đổi mà tôi có, nghĩ rằng nó có thể ở đó, nhưng đã xuất hiện ngắn. Đây là một truy vấn đặc biệt (không có ứng dụng.) Và tôi hy vọng tránh điều chỉnh DB bằng cách thêm một UDF. Tại một số thời điểm nó có thể trở thành một phần của một ứng dụng và tất cả những vấn đề này sẽ biến mất. – mickeyf

+0

Thú vị cần lưu ý rằng điều này không làm việc: 'chọn convert (int, chuyển đổi (varbinary, '0x1', 1)) ' nhưng điều này: ' chọn convert (int, chuyển đổi (varbinary, '0x01 ', 1)) ' Vì lý do nào đó, số 0 đứng đầu SAU các vấn đề' 0x' đối với các chuỗi ký tự đơn. –

+2

@ carl.anderson [Hành vi này được mô tả rõ ràng:] (https://msdn.microsoft.com/en-us/library/ms187928.aspx#Anchor_8) "Biểu thức phải bao gồm một số chẵn các chữ số thập lục phân. .. Nếu biểu thức chứa một số ký tự lẻ ... một lỗi được nêu lên. " –

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