2013-03-12 59 views
2

如果我從註冊表獲取到SQL我的時區的信息,我得到充分的TZI數據結構:爲什麼我的TSQL varbinary數據越來越截斷

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' 

它返回完整的二進制值

'0xE001000000000000C4FFFFFF00000B0000000100020000000000000000000300000002000200000000000000'

但是,如果我把它保存在像這樣的變量:

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'

我曾嘗試二進制/ VARBINARY和長度(包括MAX)的每一個排列,我能想到的。

任何想法?

+0

' xp_regread'是一個未記錄的存儲過程 - 但可能輸出參數只是用於返回smallint值,並且在內部(在某個點)該值被截斷爲16位。無論你給它什麼類型的變量,它只會給你在該參數中的16位。 – 2013-03-12 07:11:19

回答

2

我願意做它使用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 

(插入通常警告有關使用/依靠無證程序)

+0

感謝您的建議 - 它可能有效。我會讓你知道... – user2158889 2013-03-12 14:40:20

+0

@ user2158889 - 真的嗎?你使用的是什麼版本(最初在SQL Server 2012上測試過,只是在2005年重新測試過)? (並且我首先使用原始腳本驗證了截斷問題,所以它不是我們機器之間的一般差異) – 2013-03-12 14:44:45

+0

很好,謝謝! – user2158889 2013-03-12 15:52:14