2010-01-11 42 views
1

目前有此功能可以從TSQL中的註冊表獲取值。但是,我需要獲取DigitalProductId並且不返回所需的值。我認爲它在註冊表中存儲爲二進制文件。如何通過TSQL從註冊表中獲取DigitalProductId

任何想法?

DECLARE @retvalue int, @data varchar(500) 
EXECUTE @retvalue = master.dbo.xp_instance_regread 'HKEY_LOCAL_MACHINE', 
'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 
'DigitalProductId', @param = @data OUTPUT 
PRINT 'ProductId: '+ @data 

編輯:我已經更新的問題和代碼。

+1

它適用於我。你有什麼?空的?錯誤? – 2010-01-11 14:44:48

+1

也適用於我。這是否會在一個實例,所有實例,來自一個客戶端,所有客戶端都失敗?比「看起來不起作用」更具體一點會有所幫助。 – 2010-01-11 14:52:45

+0

我已經稍微更新了問題,代碼現在包含「DigitalProductId」。 – Coolcoder 2010-01-11 15:25:08

回答

0

DigitalProductIdREG_BINARY的關鍵。

xp_instance_regread將它讀取的所有內容都轉換爲以空字符結尾的字符串,因此如果該字符串包含NULLs,則不會返回任何有意義的內容。

xp_instance_regread是一個不適用於生產環境的未公開的過程。如果您需要從SQL Server的側面讀取註冊表項,則最好編寫自己的XP來執行此操作。

+0

那麼,有可能CAST回到可顯示的值?從註冊表中正確提取DigitalProductId就像這個PWK9P-6GFTM-792RH-JDM92-TXV9E。 – Coolcoder 2010-01-11 15:29:48

+0

它需要在所有版本的SQL(2000,2005,2008)包括快速版本中工作。這個過程是內置的,我不認爲有可能做任何其他的方式,除非CLR過程開發,這需要2005年最低和CLR作爲預先要求啓用。 – Coolcoder 2010-01-11 15:31:48

+0

'@ Coolcoder':'XP'只是返回一個指向數據的指針,SQL Server將這些數據轉換爲'VARCHAR'(因爲這就是'XP'所期望的)。數據包含兩個被視爲字符串分隔符的零,並且字符串被截斷。因此,當註冊表值達到「SQL Server」時,第一個零後的所有內容都將無法恢復。 – Quassnoi 2010-01-11 15:34:42