كيف يمكنني طباعة قيمة ثنائية كما عرافة في tsql ضمن?

StackOverflow https://stackoverflow.com/questions/68677

  •  09-06-2019
  •  | 
  •  

سؤال

أنا باستخدام SQL Server 2000 إلى طباعة بعض القيم من جدول باستخدام PRINT.مع معظم غير سلسلة البيانات ، يمكن أن يلقي إلى nvarchar أن تكون قادرة على الطباعة ، ولكن القيم الثنائية محاولة لتحويل باستخدام بت تمثيل الشخصيات.على سبيل المثال:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

المتوقع:

0x12345678

بدلا من ذلك, فإنه يطبع اثنين رطانة الشخصيات.

كيف يمكنني طباعة قيمة الثنائية البيانات ؟ هناك المدمج في أو هل أنا بحاجة إلى لفة بلدي ؟

تحديث:ليس هذا فقط قيمة على الخط ، لذلك لا استطيع طباعة @binvalue.إنه شيء أشبه الطباعة ن'other الأشياء' + ????+ N المزيد الأشياء'.لست متأكدا إذا كان هذا يحدث فرقا:أنا لم أحاول مجرد طباعة @binvalue في حد ذاته.

هل كانت مفيدة؟

المحلول

إذا كنت في Sql Server 2005 هل يمكن استخدام هذا:

print master.sys.fn_varbintohexstr(@binvalue)

لا أعتقد أن هذا موجود في 2000, رغم أن, لذلك قد تحتاج إلى لفة الخاص بك.

نصائح أخرى

لا تستخدم master.sys.fn_varbintohexstr - هو بطيئة بشكل رهيب, ممن لا يحملون وثائق ثبوتية ، غير معتمد ، قد تذهب بعيدا في النسخة المستقبلية من SQL Server.

إذا كنت بحاجة إلى تحويل binary(16) إلى عرافة شار استخدام convert:

convert(char(34), @binvalue, 1)

لماذا 34?لأن 16*2 + 2 = 34, هذا هو "0 x" - 2 رموز زائد 2 رموز لكل شار.

حاولنا جعل 2 الاستفسارات على طاولة مع 200000 الصفوف:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

أول واحد يعمل 2 دقيقة, في حين أن الثانية - 4 ثوان.

select convert(varchar(max), field , 1) 
from table

قبل using varchar(max) لن تضطر إلى القلق بشأن تحديد حجم (نوعا ما).

مضيفا الجواب الذي يظهر مثال آخر على تحويل الثنائية البيانات إلى hex string, والعودة مرة أخرى.

أريد تحويل أعلى timestamp القيمة في varchar:

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

والتي ترجع:

LastTS
==================
0x000000000086862C

ملاحظة:من المهم أن استخدام CONVERT لتحويل varbinary -> varchar.باستخدام CAST لا تعمل:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

علاج ثنائي البيانات الشخصيات بدلا من عرافة قيم إرجاع سلسلة فارغة.

عكس ذلك

لتحويل المخزنة hex string العودة إلى الطابع الزمني:

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)

ملاحظة:أي قانون صدر في المجال العام.لا إسناد المطلوبة.

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

لا يلقي.

صب يحول الثنائية إلى النص من حيث القيمة على المقابلة ترتيب إعداد بيانات محددة.

[تبدأ عدل] إذا كنت بحاجة إلى طباعة قيمة في متغير سلسلة استخدام وظيفة اقترح إيريك Z اللحية.

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

إذا هذه الوظيفة ليست تحت تصرفكم بسبب إصدارات الخادم أو لأنه يحتاج أذونات خاصة ، يمكنك إنشاء الخاصة بك وظيفة.

لنرى كيف أن المهمة تم تنفيذها في SQL Server 2005 Express edition يمكنك تنفيذ:

sp_helptext 'fn_varbintohexsubstring'

جئت عبر هذا السؤال حين تبحث عن حل مشكلة مماثلة أثناء الطباعة عرافة القيمة التي تم إرجاعها من hashbytes وظيفة في SQL Server 2005.

للأسف في هذا الإصدار من SQL Server, تحويل لا يبدو أن العمل في كل شيء ، إلا fn_varbintohexsubstring يفعل الشيء الصحيح:

فعلت:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

هنا هو نتيجة حصلت في SQL Server 2005 (

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(هناك في الواقع ليست للطباعة الشخصية قبل '4Vx هو أنني بعد صورة ، ولكن أنا لم يكن لديك ما يكفي من النقاط حتى الآن).


تحرير:فقط إضافة على SQL Server 2008 R2 مشكلة مع تحويل ثابتة مع الإخراج التالي:

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top