1

这是存储过程:

     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

我可以从转换中恢复@@procid,但不能恢复存储过程名称。知道吗?OBJECT_NAME 函数有什么问题吗?

结果: 在此处输入图像描述

4

1 回答 1

2

对象名称属于数据类型SYSNAME( 的同义词NVARCHAR(128)),因此您正在从一种数据类型转换为二进制然后再转换回另一种,因此您不会做相反的事情。您可以相当简单地证明这一点:

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


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

产生:

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

此外,NVARCHAR每个字符需要 2 个字节,因此VARBINARY(128)不足以存储它,同样,这可以证明:

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

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

这使:

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

所以你需要调整你的类型和长度:

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 
于 2016-05-09T15:45:19.130 回答