根据 MDF 文件查询数据库版本

在 SQL Server 中,MDF(主数据库文件)包含了数据库的版本信息。如果需要查询 MDF 文件对应的 SQL Server 版本,可以使用 PowerShell 读取文件中的特定字节数据。

1. 使用 PowerShell 查询 MDF 版本

PS > get-content -Encoding Byte "C:\path\to\database.mdf" | select-object -skip 0x12064 -first 2
PS > [int]($_[0] + $_[1] * 256)

2. 解析数据库版本

上述 PowerShell 命令的逻辑如下:

  1. get-content -Encoding Byte "C:\path\to\database.mdf" 以字节形式读取 MDF 文件。
  2. select-object -skip 0x12064 -first 2 跳过前 0x12064 个字节,并获取接下来的 2 个字节(这两个字节存储了 SQL Server 版本信息)。
  3. $_[0] + $_[1] * 256 计算版本号。

例如,我们执行下面的命令:

get-content -Encoding Byte "d:/B2B.mdf" | select-object -skip 0x12064 -first 2

命令返回:

149
2

那么,我们用149+2*256来计算版本号,得到结果是661,然后到下表里面去查找即可。

如果不想手动计算,也可以使用下面的三行命令,让程序自动计算版本号:

PS > $bytes = Get-Content -Encoding Byte "d:/B2B.mdf" | Select-Object -Skip 0x12064 -First 2
PS > $version = $bytes[0] + ($bytes[1] * 256)
PS > $version

3. 版本号对照表

计算出的整数版本号可以对照以下 SQL Server 版本表:

版本号SQL Server 版本
515SQL Server 7.0
539SQL Server 2000
611SQL Server 2005
655SQL Server 2008
661SQL Server 2008 R2
706SQL Server 2012
782SQL Server 2014
852SQL Server 2016
869SQL Server 2017
904SQL Server 2019
921SQL Server 2022

4. 结论

通过 PowerShell 读取 MDF 文件的特定字节,我们可以快速确定数据库版本,无需启动 SQL Server 实例。此方法适用于数据库管理员或运维人员排查数据库兼容性问题。

sqlserver 数据库锁

1、HOLDLOCK

其他事务可以读取,但不能更新删除

// language: sql
BEGIN TRAN
SELECT * FROM ceb_Area WITH(ROWLOCK,HOLDLOCK) where ID=1--行锁
SELECT * FROM ceb_Area WITH(TABLOCK,HOLDLOCK) where ID=1--表锁
WAITFOR DELAY '00:00:10'
COMMIT TRAN;  

2、TABLOCKX 排他表锁

其他事务不能读取表,更新和删除

// language: sql
BEGIN TRAN
SELECT * FROM CheweiCustoms WITH(TABLOCKX) WHERE id=313;
UPDATE CheweiCustoms SET Name='abccc' WHERE id = 313;
SELECT * FROM CheweiCustoms WHERE id=313;
WAITFOR DELAY '00:00:10';
COMMIT TRAN;  

同一个事物内,可以操作被锁住的表。其它事物不能操作,必须等锁表的事物完成后才行。

解决 ASP.NET Core 连接 SQL Server 时“证书链由不受信任的颁发机构颁发”错误

使用基于.NET 8的ASP.NET Core连接sql server数据库时,遇到报错:sql server 证书链是由不受信任 的颁发机构颁发的

解决办法是,在数据库连接串上增加TrustServerCertificate=False;,即改为下面的形式就可以了:

// language: csharp
Data Source=.;Initial Catalog=WorkSummary;User Id=sa;Password=123456;Encrypt=False;TrustServerCertificate=False;

SQL SERVER 2008 R2 实现 sequence

SQL SERVER 2008 R2 使用存储过程实现类似Oracle的sequence的功能:

-- Create the sequencing table that is used to hold the sequence values.

CREATE TABLE SQL_SERVER_SEQUENCE (
NAME VARCHAR(30) NOT NULL,
VALUE BIGINT DEFAULT 0 NOT NULL,
CONSTRAINT PK_SQL_SERVER_SEQUENCE PRIMARY KEY (NAME)
);
-- Create the stored procedure that is responsible for incrementing the sequence and return it.
ALTER PROCEDURE SQL_SERVER_SEQUENCE_NEXTVAL
@name VARCHAR(30)
AS
BEGIN
DECLARE @value BIGINT
BEGIN TRANSACTION
UPDATE SQL_SERVER_SEQUENCE
SET @value = value = value + 1
WHERE name = @name;
COMMIT TRANSACTION
SELECT @value AS NEXTVAL
END;

创建后,在表SQL_SERVER_SEQUENCE中添加一行

如:NAME    VALUE

         yypz        0

用法:

SQL_SERVER_SEQUENCE_NEXTVAL 'yypz'

sql server游标

sql server游标的使用示例代码:

declare test_cursor cursor for
select  t1.baijiahao as bjh_name, t1.baijiahao_home_url as home_url, t2.category_name as domain from baijia_articles t1
inner join category t2
on t1.cat_id = t2.id
open test_cursor
declare @bjh_name nvarchar(50)
declare @home_url nvarchar(90)
declare @domain nvarchar(50)
fetch next from test_cursor into @bjh_name, @home_url, @domain
while @@fetch_status=0
begin
       
       if not exists ( select id from baijiahao where bjh_name=@bjh_name)  insert into baijiahao(bjh_name, home_url, domain) values(@bjh_name, @home_url, @domain)
       fetch next from test_cursor into @bjh_name, @home_url, @domain
end
close test_cursor
deallocate test_cursor