关于sqlserver字符类型查询条件区分大小写,开窗函数

昨天一台SQL
Server 2008R2的数据库在凌晨5点多抛出下面告警信息:

在写sql的查询时 如下:

1.基本概念

 

 select * from Users where username=’WangE’

开窗函数分为两个部分分别是

 The log scan
number (620023:3702:1) passed to log scan in database ‘xxxx’ is not
valid. This error may indicate data corruption or that the log file
(.ldf) does not match the data file (.mdf). If this error occurred
during replication, re-create the publication. Otherwise, restore from
backup if the problem results in a failure during startup.

 select * from Users where username=’wange’

1.聚合,排名,偏移,分布函数 。

 

上面两条查询语句的结果是一样的,这说明username的条件并没有区分大小写。

2.开窗分区,排序,框架。

 

 

下面举个例子

  
乍一看,还以为数据库损坏了(data corruption),但是在做完DBCC
CHECKDB后,发现其实数据库其实是完好无损的。那么肯定是跟Replication有关。但是在搜索了相关资料,仅仅在The
process could not execute
‘sp_repldone/sp_replcounters”
这篇博客中找到了类似错误的资料:

若要使用上面的的语句能够执行按区分大小写查询 需要在查询的结尾加上
collate Chinese_PRC_CS_AI_WS

SELECT empid, ordermonth, val,
  SUM(val) OVER(PARTITION BY empid
                ORDER BY ordermonth
                ROWS BETWEEN UNBOUNDED PRECEDING
                         AND CURRENT ROW) AS runval
FROM Sales.EmpOrders;

 

完整语句是:

sum(val)  就是集合函数

Common Causes

 

  • The last LSN in Transaction Log is less than what the LSN Log Reader
    is trying to find. An old backup may have been restored on top of
    Published Database. After the restore, the new Transaction Log
    doesn’t contain the data now distributor & subscriber(s) have.

  • Database corruption.

 

select * from Users where username=’WangE’ collate
Chinese_PRC_CS_AI_WS

over() 就是开窗     PARTITION BY empid  就是开窗分区(分组)   ORDER BY
ordermonth 开窗排序  

How to fix this

 

  • Ensure database consistency by running DBCC CHECKDB on the
    database. 

  • If an old backup was restored on top of published database then
    use sp_replrestart

  • If going back to the most recent transaction log backup is not an
    option then execute sp_replrestart  on
    publisher in published database. This stored procedure is used when
    the highest log sequence number (LSN) value at the Distributor does
    match the highest LSN value at the Publisher.

  • This stored procedure will insert compensating LSNs (No Operation)
    in the publisher database log file till one the compensating LSN
    becomes more than the highest distributed LSN in distribution
    database for this published database. After this it inserts this new
    high LSN in the msrepl_transactions table in the distribution
    database and executes sp_repldone on published database to update
    the internal structures to mark a new starting point for log reader
    agent.

  • Ensure that the log reader agent is stopped and there is no incoming
    transactions on the published database, when this SP is executed.

  • Since transactions may have been lost, we recommend to reinitialize
    the subscriber(s) and/or recreate publication/subscription(s).  For
    large databases consider using “Initialize from Backup” as discussed
    in SQL Book Online.

 

但是在这个案例当中,
数据库既没有损坏,也没有还原过。 只能是Replication出现了错误,但是在SQL
Server的Replication中又没有找到相关错误信息,本身这个是AWS的DMS自动生成的Replication,很多内部信息不太清楚(例如,是否出现异常),官方也没有找到很详细的介绍这个错误的相关资料。在此记录一下。

 

 

 

 

参考资料:

 

 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  开窗架构

2.排名开窗函数

 SQL SERVER 支持4个排名函数 ROW_NUMBER,RANK,DENSE_RANK ,NTLE 
 来看看它们分别的作用

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图