SqlServer – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Tue, 05 Apr 2022 15:37:45 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 使用sqlserver的排名函数实现积分排名 https://www.mlplus.net/2022/04/06/sql-server-rank-handle/ https://www.mlplus.net/2022/04/06/sql-server-rank-handle/#respond Wed, 06 Apr 2022 01:00:00 +0000 https://www.mlplus.net/?p=3828 背景

客户需要针对用户的积分进行排名,按照积分的多少降序进行。为了更快更好的满足客户需求,就采取了SQL Server已有的排名函数RANKDENSE_RANK来实现

RANK

返回结果集的分区内每行的排名。 行的排名是相关行之前的排名数加一。

ROW_NUMBER RANK 类似。 ROW_NUMBER 按顺序对所有行进行编号(例如: 1、2、3、4、5)。 RANK 为相应关联提供相同的数值(例如: 1、2、2、4、5)。

RANK是运行查询时计算出的临时值

语法


RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名

DENSE_RANK

此函数返回结果集分区中每行的排名,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。

语法

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
如果两个或更多行在同一分区中具有相同的排名值,那么每个行将获得相同的排名

积分排名实现

数据准备

-- 创建积分表
Create table integral
(
  userUid varchar(36),
  integralScore decimal(18,2)
);
-- 创建用户表
Create table UserInfo
(
 userUid varchar(36),
 user_name varchar(100)
);
--查询
with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
  
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第0张图片

rank函数实现排名,排名不连续,排名会跳过序号。如上图所示。此种情况可以使用dense_rank函数来解决,这样排名需要就会连续出现。


with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  dense_rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第1张图片

当使用dense_rank函数排名后,就完美避免了排名跳编号的问题。



转载请注明:清风亦平凡 » 使用sqlserver的排名函数实现积分排名

]]>
https://www.mlplus.net/2022/04/06/sql-server-rank-handle/feed/ 0
Microsoft SQL Server跨服务器查询 https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/ https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/#respond Sun, 23 May 2021 01:00:00 +0000 https://www.mlplus.net/?p=3501 创建链接服务器

sp_addlinkedserver

创建链接服务器。 链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。 使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。 如果链接服务器定义为 SQL Server实例,则可执行远程存储过程。

语法


sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

参数

[ @server =] ‘ 服务器 ‘
要创建的链接服务器的名称。 server 的数据类型为 sysname,无默认值。

[ @srvproduct =] ‘ product_name ‘
要添加为链接服务器的 OLE DB 数据源的产品名称。 product_name 为 nvarchar ( 128 ),默认值为 NULL。 如果不需要指定 SQL Server、 provider_name、 data_source、 位置、 provider_string 和 目录 。

[ @provider =] ‘ provider_name ‘
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。 对于当前计算机上安装的指定 OLE DB 提供程序, provider_name 必须是唯一的。 provider_name 为 nvarchar (128),默认值为 NULL;但是,如果省略 provider_name ,则使用 sqlncli.msi。

使用 SQLNCLI.MSI 将重定向 SQL Server 到 SQL Server Native Client OLE DB 提供程序的最新版本。 OLE DB 提供程序应以指定的 PROGID 在注册表中注册。

以前的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 和 SQL Server Native Client OLEDB 提供程序 (SQLNCLI) 仍然不推荐使用,不建议在新的开发工作中使用它们。 相反,请使用新的 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL),其将使用最新的服务器功能进行更新。

[ @datasrc =] ‘ data_source ‘
由 OLE DB 访问接口解释的数据源的名称。 data_source (4000 ) 为 nvarchar。 data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 提供程序。

[ @location =] ‘ 位置 ‘
由 OLE DB 访问接口解释的数据库的位置。 location (4000 ) 为 NVARCHAR,默认值为 NULL。 location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 提供程序。

[ @provstr =] ‘ provider_string ‘
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。 provider_string 为 nvarchar ( 4000 ),默认值为 NULL。 provstr 传递给 IDataInitialize,或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 提供程序。

当针对 SQL Server Native Client OLE DB 提供程序创建链接服务器时,可以通过使用 server 关键字 as server =servername \ instancename 指定的特定实例来指定实例 SQL Server 。 servername 是运行的计算机的名称 SQL Server , instancename 是 SQL Server 用户将连接到的特定实例的名称。

若要访问镜像数据库,则连接字符串必须包含数据库名称。 该名称是数据访问接口启用故障转移尝试所必需的。 可以在 @ provstr 或 @ catalog 参数中指定数据库。 此外,连接字符串还可以提供故障转移伙伴名称。

返回代码值

0(成功)或 1(失败)

sp_addlinkedsrvlogin

创建或更新 SQL Server 本地实例上的登录名与远程服务器中安全帐户之间的映射。

语法


sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
     [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
     [ , [ @locallogin = ] 'locallogin' ]   
     [ , [ @rmtuser = ] 'rmtuser' ]   
     [ , [ @rmtpassword = ] 'rmtpassword' ]

参数

[ @rmtsrvname = ] 'rmtsrvname'
应用登录映射的链接服务器的名称。 rmtsrvname 的值为 sysname,无默认值。

[ @useself = ] { 'TRUE' | 'FALSE' | NULL }'
确定是通过模拟本地登录名连接到 rmtsrvname ,还是显式提交登录名和密码。 数据类型为 varchar ( 8 ),默认值为 TRUE。

如果值为 TRUE,则指定登录名使用其自己的凭据连接到 rmtsrvname,并忽略 rmtuser 和 rmtpassword 参数。 FALSE 指定 rmtuser 和 rmtpassword 参数用于连接到指定 locallogin 的 rmtsrvname 。 如果将 rmtuser 和 RMTPASSWORD 设置为 NULL,则不会使用登录名或密码连接到链接服务器。

[ @locallogin = ] 'locallogin'
本地服务器上的登录。 locallogin 的值为 sysname,默认值为 NULL。 NULL 指定此条目适用于连接到 rmtsrvname 的所有本地登录名。 如果不为 NULL,则 locallogin 可以为 SQL Server 登录名或 Windows 登录名。 对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。

[ @rmtuser = ] 'rmtuser'
当为 FALSE 时,用于连接到 rmtsrvname 的远程登录名 @useself 。 当远程服务器是 SQL Server 不使用 Windows 身份验证的实例时, rmtuser 是一个 SQL Server 登录名。 rmtuser 的值为 sysname,默认值为 NULL。

[ @rmtpassword = ] 'rmtpassword'
与 rmtuser 关联的密码。 rmtpassword 的值为 sysname,默认值为 NULL。

返回代码值

0(成功)或 1(失败)

sp_droplinkedsrvlogin 

删除运行 SQL Server 的本地服务器上的登录与链接服务器上的登录之间的现有映射。

语法


sp_droplinkedsrvlogin [ @rmtsrvname= ] 'rmtsrvname' ,   
   [ @locallogin= ] 'locallogin'

参数

[ @rmtsrvname = ] 'rmtsrvname' 应用登录映射的链接服务器的名称 SQL Server 。 rmtsrvname 的值为 sysname,无默认值。 rmtsrvname 必须已存在。

[ @locallogin = ] 'locallogin'SQL Server本地服务器上的登录名,它具有到链接服务器的映射 rmtsrvname。 locallogin 的值为 sysname,无默认值。 必须已经存在 locallogin 到 rmtsrvname 的映射。 如果为 NULL,则会删除 sp_addlinkedserver 创建的默认映射,该映射将本地服务器上的所有登录名映射到链接服务器上的登录名。

返回代码值

0(成功)或 1(失败)

sp_dropserver 

从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。

语法


sp_dropserver [ @server = ] 'server'   
     [ , [ @droplogins = ] { 'droplogins' | NULL} ]

参数

服务器
要删除的服务器。 server 的数据类型为 sysname,无默认值。 服务器 必须存在。

droplogins
指示如果指定了 droplogins ,则还必须删除 服务器 的相关远程服务器和链接服务器登录名。 @droplogins 为 char (10),默认值为 NULL。

返回代码值

0(成功)或 1(失败)

示例

Microsoft SQL Server跨服务器查询-第0张图片

异地服务器, 数据库之间的查询

创建链接服务器


EXEC sp_addlinkedserver
@server = 'SourceHost', -- 目标服务器别名
@srvproduct = 'MSSQL',  -- 产品名称
@datasrc = '192.168.0.132\MSSQLSERVER2012' , -- 目标服务器名称
@provider = 'SQLOLEDB'

登录链接服务器


EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'SourceHost' , -- 与以上 @server 同名
@useself = 'false' ,
@locallogin = NULL ,
@rmtuser = 'sa' ,
@rmtpassword = '123'

删除登录与链接服务器的映射


--删除登录与链接服务器的映射
exec sp_droplinkedsrvlogin  @rmtsrvname= 'SourceHost' ,   
    @locallogin= 'locallogin'  

删除链接服务器


--删除链接服务器 
exec sp_dropserver 'SourceHost', 'droplogins'

查询异地服务器的目标数据库


select * from SourceHost.目标数据库名称.dbo.表名



转载请注明:清风亦平凡 » Microsoft SQL Server跨服务器查询

]]>
https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/feed/ 0
Sql Server 中关闭/取消ID自增字段 https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/ https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/#respond Tue, 10 Apr 2012 01:21:00 +0000 https://www.mlplus.net/?p=1995 在数据库进行表设计的时,大多情况下都习惯使用一个自增列作为主键,具体原因这里不会进行描述。在很多情况下需要对现有数据进行数据迁移,这个时候就需要保证迁移后的数据自增列的数据保持不变。SQL SERVER是支持这种迁移方式的。

首先就要先取消自增长,数据迁移完成后再恢复自增长即可。

SET IDENTITY_INSERT

允许将显式值插入表的标识列中。

语法
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }

实例


set IDENTITY_INSERT tableName on; 
INSERT INTO   tableName  (id,name) VALUES (2,'name');
set IDENTITY_INSERT  tableName  off; 



转载请注明:清风亦平凡 » Sql Server 中关闭/取消ID自增字段

]]>
https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/feed/ 0