2013-04-23 112 views
0

我想以编程方式获取SQL Server数据库的内部数据库版本号,以确定要使用哪个SQL Server实例。如何获取.MDF数据库的内部SQL Server数据库版本号?

即SQL Server 2008中 - 版本661,SQL Server 2008 R2的 - 版本665

我发现了一篇文章:http://rusanu.com/2011/04/04/how-to-determine-the-database-version-of-an-mdf-file/,显示版本号,偏移量为DWORD值的位置0×12064在.mdf文件。

如何以编程方式获取此信息?

感谢

回答

0

如果数据库已经连接:

CREATE TABLE #d 
(
    ParentObject NVARCHAR(4000), 
    [Object] NVARCHAR(4000), 
    Field NVARCHAR(4000), 
    VALUE NVARCHAR(4000) 
); 

DECLARE @sql NVARCHAR(MAX) = N'dbcc page(' + RTRIM(DB_ID()) 
    + ',1,9,3) with tableresults;' 

INSERT #d EXEC sp_executesql @sql; 

SELECT [Version] = VALUE FROM #d WHERE Field = N'dbi_version'; 

DROP TABLE #d; 

虽然如果数据库已经连接,那么它已经在实例的版本。如果数据库没有附加,为什么不把它附加到最新版本?仅仅因为数据库目前是661并不意味着它必须保持这种状态。如果您将它附加到2008 R2或2012,它也会起作用。

+0

我似乎在将SQL Server 2008数据库附加到SQL Server 2012实例时遇到问题。这是不同的情况吗?这是促使我问这个问题的原因。我无法升级版本。降级甚至支持吗? – J2Tuner 2013-04-23 14:34:59

+0

对不起,我只是重新阅读你的文章的最后一行。我仍然有问题将旧版本附加到较新的实例,虽然... – J2Tuner 2013-04-23 14:37:48

+0

@ J2Tuner什么是“问题”,你在说什么“年长”?例如,你不能附加2000到2012,但是任何比2000年更新的东西都应该适用于你所拥有的最新版本。 – 2013-04-23 14:39:48

0

下面是我创建的存储过程,用于使用OLE自动化和ADO的Stream对象读取离线.mdf。该解决方案更上下文张贴在这里以及:https://social.technet.microsoft.com/Forums/sqlserver/en-US/3de5b574-0751-44a2-b69f-fa0c20378359/how-to-determine-sql-server-version-of-an-mdf-file?forum=sqlsetupandupgrade

CREATE /*ALTER*/ PROCEDURE spDBVersion 
(
@FilePath nvarchar(500) /*Your filepath here EG 'C:\SQLData\somedatabase.mdf'*/ 
) 
AS 

DECLARE @HR int, 
     @objStream int, 
     @strErrorMessage Varchar(1000), 
     @Source nvarchar(255), 
     @Desc nvarchar(255), 
     @offset bigint, 
     @binary1 binary, 
     @binary2 binary 

SET NOCOUNT ON 

SELECT @strErrorMessage='Creating ADO stream object' 
EXEC @HR = sp_OACreate 'ADODB.Stream' , @objStream OUT 
IF @HR <> 0 GOTO CLEANUP 

SELECT @strErrorMessage='Opening ADO stream' 
EXEC @HR = sp_OAMethod @objStream, 'Open' 
IF @HR <> 0 GOTO CLEANUP 

SELECT @strErrorMessage='Declaring ADO stream type binary' 
EXEC @HR = sp_OASetProperty @objStream, 'Type', 1 
IF @HR <> 0 GOTO CLEANUP 

SELECT @strErrorMessage='Opening File into ADO stream' 
EXEC @HR = sp_OAMethod @objStream, 'LoadFromFile', NULL , @FilePath 
IF @HR <> 0 GOTO CLEANUP 

SELECT @offset = 73828 --9 * 8192 + 96 + 4 

SELECT @strErrorMessage='Setting offset to read file' 
EXEC @HR = sp_OASetProperty @objStream, 'Position', @offset 
IF @HR <> 0 GOTO CLEANUP 

SELECT @strErrorMessage = 'Reading Version number from mdf' 
EXEC @HR = sp_OAMethod @objstream, 'Read', @binary1 OUT , 1 
IF @HR <> 0 GOTO CLEANUP 

SELECT @strErrorMessage = 'Reading Version number from mdf' 
EXEC @HR = sp_OAMethod @objstream, 'Read', @binary2 OUT , 1 
IF @HR <> 0 GOTO CLEANUP 

SELECT @binary1 + 256 * @binary2 AS DatabaseVersion 

END_ROUTINE: 
RETURN 

CLEANUP: 
BEGIN 
    EXEC sp_OAGetErrorInfo @objStream, 
     @Source OUT, 
     @Desc OUT; 
     SELECT ErrorInSP='spDBVersion', 
     HR = convert(varbinary(4),@HR), 
     [email protected], 
     [email protected], 
     [email protected] 
    GOTO END_ROUTINE 
END 
GO 

此存储过程需要OLE自动化,所以你会希望把它包在一些重新配置语句假设OLE被禁用(因为它可能应该是)。

EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 
EXEC sp_configure 'Ole Automation Procedures', 1 
RECONFIGURE 
GO 

exec spDBVersion 'E:\SQLData\somedatabase.mdf' 


GO 
EXEC sp_configure 'Ole Automation Procedures', 0 
RECONFIGURE 
GO 
EXEC sp_configure 'show advanced options', 0 
RECONFIGURE 
GO