下面是我创建的存储过程,用于使用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
我似乎在将SQL Server 2008数据库附加到SQL Server 2012实例时遇到问题。这是不同的情况吗?这是促使我问这个问题的原因。我无法升级版本。降级甚至支持吗? – J2Tuner 2013-04-23 14:34:59
对不起,我只是重新阅读你的文章的最后一行。我仍然有问题将旧版本附加到较新的实例,虽然... – J2Tuner 2013-04-23 14:37:48
@ J2Tuner什么是“问题”,你在说什么“年长”?例如,你不能附加2000到2012,但是任何比2000年更新的东西都应该适用于你所拥有的最新版本。 – 2013-04-23 14:39:48