varbinary thành chuỗi trên SQL Server


93

Làm cách nào để chuyển đổi giá trị cột từ varbinary(max)sang varcharở dạng con người có thể đọc được?


3
tôi muốn varchar vì giá trị được isterted từ chuỗi giá trị .. Tôi có nghĩa là để đọc những gì được viết ..
Bilgin Kılıç

@MartinSmith ppl thúc tôi thay đổi. Vì vậy, đã đánh dấu lại câu trả lời của bạn. cảm ơn bạn đã komments loại của bạn.
Bilgin Kılıç

Con người dường như sắp qua này từ các công cụ tìm kiếm và trên cơ sở biểu quyết tham số kiểu 2 dường như phổ biến hơn cần thiết nhưng điều này không làm những gì yêu cầu ban đầu của bạn là
Martin Smith

Câu trả lời:


87

"Chuyển đổi a varbinarythành varchar" có thể có nghĩa khác nhau.

Nếu varbinary là biểu diễn nhị phân của một chuỗi trong SQL Server (ví dụ trả về bởi đúc để varbinarytrực tiếp hoặc từ DecryptByPassPhrasehoặc DECOMPRESSchức năng), bạn có thể chỉ CAST

declare @b varbinary(max)
set @b = 0x5468697320697320612074657374

select cast(@b as varchar(max)) /*Returns "This is a test"*/

Điều này tương đương với việc sử dụng CONVERTvới tham số kiểu là 0.

CONVERT(varchar(max), @b, 0)

Các thông số kiểu khác có sẵn CONVERTcho các yêu cầu khác nhau như đã nêu trong các câu trả lời khác.


38
CÂU TRẢ LỜI NÀY KHÔNG ĐÚNG. Tôi đã thử nghiệm nó trên bảng với SID của người dùng - lượng giá trị được đúc Phân biệt ít hơn lượng SID nhị phân Phân biệt. Bạn nên sử dụng CONVERT (VARCHAR (...), binaryValue, 2) để lấy giá trị duy nhất - câu trả lời từ Gunjan Juyal là một trong những quyền - nó phải được đánh dấu là giải pháp
Philipp Munin

13
@PhilippMunin - Hai câu trả lời làm những điều khác nhau. Một này có kết quả của một biểu thức như SELECT CAST('This is a test' AS VARBINARY(100))đó là 0x5468697320697320612074657374trong collation mặc định của tôi và chuyển đổi nó sao cho varcharchuỗi. Câu trả lời của Gunjan trả về biểu diễn hex dưới dạng một chuỗi ('5468697320697320612074657374') Có lẽ cách giải thích này đúng với nhu cầu của OP vì họ đã chấp nhận nó.
Martin Smith

8
CÂU TRẢ LỜI NÀY LÀ ĐÚNG! Tôi đã thử nghiệm nó và nó thực hiện những gì tôi và OP mong muốn.
Ronnie Overby

1
@BIDeveloper nếu bạn đã đọc các nhận xét ở trên (cụ thể là ý kiến ​​của tôi), bạn sẽ nhận ra rằng vấn đề là "chuyển đổi varbinary thành varchar" có thể được hiểu theo nhiều cách khác nhau. Thật vậy, đây là lý do tại sao CONVERTcó tham số kiểu để chọn theo cách bạn muốn (theo cách hiểu của tôi là kiểu mặc định) Vì vậy, câu trả lời này có thể không phải là những gì bạn cần cho trường hợp sử dụng của mình vào lúc này nhưng nó đúng cho các trường hợp sử dụng khác. Bao gồm cả câu hỏi ban đầu của người chỉ định "dạng người đọc được" không phải hex.
Martin Smith

1
SQL 2005 bạn có thể sử dụng sys.fn_sqlvarbasetostr (@binary) vì CONVERT sẽ trống đối với tôi
TheNerdyNerd

149

Biểu thức sau phù hợp với tôi:

SELECT CONVERT(VARCHAR(1000), varbinary_value, 2);

Dưới đây là thông tin chi tiết về lựa chọn kiểu dáng (tham số thứ ba).


Như được mô tả bởi @ lara-mayugba bên dưới, kiểu 1 bao gồm tiền tố 0x trên kết quả có thể hữu ích ..
Stan

@celerno tại sao họ sẽ? Điều này không làm những gì họ cần.
Martin Smith

1
Trước năm 2008 sử dụng sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd ngày

@metabuddy - nó là thông tin sai lệch theo cách nào? Nó nói rằng thuật ngữ "Chuyển đổi một varbinary thành một varchar" có thể được thực hiện theo nhiều cách khác nhau và chúng được kiểm soát bởi tham số kiểu. Chỉ vì thông số kiểu trong câu trả lời đó không phải là thông số bạn cần cho trường hợp của mình (nhưng là thông số trả lời câu hỏi ban đầu) không làm cho nó trở thành thông tin sai lệch
Martin Smith

Để nhấn mạnh nhận xét / câu trả lời của @TheNerdyNerd, biểu thức sẽ là `select sys.fn_sqlvarbasetostr (@b) / * trả về 0x5468697320697320612074657374 * / Giả sử một thay đổi varchar (max) thành varchar (8000) vì trước năm 2008 không sử dụng nó .
Zachary Scott

62

Thực ra câu trả lời tốt nhất là

SELECT CONVERT(VARCHAR(1000), varbinary_value, 1);

bằng cách sử dụng " 2" cắt bỏ " 0x" ở đầu varbinary.


@BojieShuai Ý của bạn là "Tôi đồng ý đến mức không thể đồng ý thêm nữa" hay "Tôi đã từng đồng ý nhưng tôi không còn làm như vậy nữa"?
howcheng

@howcheng Ý tôi là "không thể đồng ý hơn". Cảm ơn vì đã chỉ ra điều này.
Bojie Shuai

15

Thử cái này

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)

6
Tôi đã phải sử dụng số 2 làm tham số thứ ba, thay vì số không. Tôi đã tìm thấy câu trả lời ở đây .
WEFX

1
trong trường hợp của tôi, tôi phải sử dụng MAX thay vì 5000
sulaiman sudirman

0

Đối với một VARBINARY(MAX)cột, tôi phải sử dụng NVARCHAR(MAX):

cast(Content as nvarchar(max))

Hoặc là

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value

0

Tôi đã thử điều này, nó hiệu quả với tôi:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);

0

Hãy xem phần bên dưới vì tôi đang gặp khó khăn trong quá trình đăng bài gốc [Đây] [1]

bcp "SELECT CAST(BINARYCOL AS VARCHAR(MAX)) FROM OLTP_TABLE WHERE ID=123123 AND COMPANYID=123" 
queryout "C:\Users\USER\Documents\ps_scripts\res.txt" -c -S myserver.db.com  -U admin -P password


  [1]: https://stackoverflow.com/questions/60525910/powershell-truncating-sql-query-output?noredirect=1#comment107077512_60525910
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.