【问题标题】:Why is my tsql varbinary data getting truncated为什么我的 tsql varbinary 数据被截断
【发布时间】:2013-03-12 00:05:09
【问题描述】:

如果我从注册表中获取我的时区信息到 ​​SQL 中,我将获得完整的 TZI 数据结构:

DECLARE @TzKey nvarchar(512)
Set @TzKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Pacific Standard Time'
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE', @TzKey, 'TZI'

它返回完整的二进制值

'0xE0010000000000000C4FFFFFF00000B0000000100020000000000000000000300000002000200000000000000'

但是,如果我将它存储在这样的变量中:

DECLARE @TzKey nvarchar(512)
DECLARE @TZI binary(85) 
Set @TzKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Pacific Standard Time'
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE', @TzKey, 'TZI', @TZI OUTPUT

然后SELECT @TZI AS TzInfo 返回'0xE001'

我已经尝试了所有我能想到的 binary/varbinary 和长度(包括 MAX)的排列。

有什么想法吗?

【问题讨论】:

  • xp_regread 是一个未记录的存储过程 - 但也许输出参数仅用于返回 smallint 值,并且在内部(在某些时候)该值被截断为 16 位。不管你给它什么类型的变量,它只会在那个参数中给你 16 位。

标签: sql-server tsql binary truncation


【解决方案1】:

我会使用INSERT ... EXEC 执行此操作,然后从插入结果的表中读取值:

DECLARE @TzKey nvarchar(512)
DECLARE @TZI binary(85) 
Set @TzKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Pacific Standard Time'
declare @Results table (Value sysname,Data varbinary(300))
insert into @Results
EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE', @TzKey, 'TZI' --, @TZI OUTPUT
select @TZI = Data from @Results

(插入关于使用/依赖未记录程序的常见警告)

【讨论】:

  • @user2158889 - 真的吗?您使用的是什么版本(最初在 SQL Server 2012 上测试。刚刚在 2005 年重新测试)? (而且我首先使用您的原始脚本验证了截断问题,所以这不是我们机器之间的一般差异)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多