2016-05-09 16 views
1

Hier ist die gespeicherte Prozedur:Weird-Ergebnis von varchar coverting zu VarBinary und Umwandlung zurück - SQL Server 2008

 CREATE PROCEDURE dbo.TestTestTest AS 
     BEGIN 
     DECLARE @ProcedureIdForTracking varbinary(128) = CONVERT(varbinary(128), @@procid) 
     DECLARE @ProcedureNameForTracking varbinary(128) = CONVERT(varbinary(128), OBJECT_NAME(@@procid)) 
     SELECT @@procid AS originalProcid, @ProcedureIdForTracking, CONVERT(bigint, @ProcedureIdForTracking) AS ConvertBackId 
     SELECT OBJECT_NAME(@@procid) AS originalName, @ProcedureNameForTracking, CONVERT(varchar(1000), 
    @ProcedureNameForTracking) AS ConvertBackName 
     SET CONTEXT_INFO @ProcedureNameForTracking 
     END 

Ich kann die @@ procid aus der Umwandlung erholen, aber nicht der Name der gespeicherten Prozedur. Irgendeine Idee? Irgendetwas stimmt nicht mit der OBJECT_NAME-Funktion?

Das Ergebnis: enter image description here

+1

Es ist nicht wirklich so komisch, du bist eine 'nvarchar' Zeichenfolge nehmen, um es zu' varbinary' Umwandlung, Umwandlung dann, dass auf ' varchar'. –

Antwort

2

Objektname sind von dem Datentyp SYSNAME (Ein Synonym für NVARCHAR(128)), Sie sind daher von einem Datentyp Umwandlung in einer anderen Binär dann zurück, so dass Sie die Rückseite nicht tun. Sie können dies zeigen ziemlich einfach:

DECLARE @ProcName SYSNAME = 'dbo.TestTestTest' 
DECLARE @VarBin VARBINARY(128) = CONVERT(VARBINARY(128), @Procname); 


SELECT Inccorect = CONVERT(VARCHAR(1000), @VarBin), 
     Correct = CONVERT(NVARCHAR(128), @VarBin); 

Welche ergibt:

Inccorect Correct 
------------------------------ 
d   dbo.TestTestTest 

Außerdem NVARCHAR erfordert 2 Bytes pro Zeichen, so ist VARBINARY(128) nicht lang genug, um es zu speichern, auch dies nachgewiesen werden kann:

DECLARE @ProcName SYSNAME = REPLICATE('|', 128); 
DECLARE @VarBin VARBINARY(128) = CONVERT(VARBINARY(128), @Procname); 

SELECT Len1 = LEN(@ProcName), 
     Len2 = LEN(CONVERT(NVARCHAR(128), @VarBin)); 

Welche gibt:

Len1 Len2 
----------------- 
128  64 

So in Sie Ihre Ausführungen und Längen einstellen müssten:

DECLARE @ProcedureIdForTracking varbinary(128) = CONVERT(varbinary(128), @@procid) 
DECLARE @ProcedureNameForTracking varbinary(256) = CONVERT(varbinary(128), OBJECT_NAME(@@procid)) 
SELECT @@procid AS originalProcid, @ProcedureIdForTracking, CONVERT(bigint, @ProcedureIdForTracking) AS ConvertBackId 
SELECT OBJECT_NAME(@@procid) AS originalName, @ProcedureNameForTracking, CONVERT(nvarchar(128), 
@ProcedureNameForTracking) AS ConvertBackName 
SET CONTEXT_INFO @ProcedureNameForTracking 
Verwandte Themen