标签: sql-server

SQL中的双数字符号##是什么意思?

元后给出了SQL的一个很好的片段

declare @search nvarchar(max) = ##searchfor:string?carefully %listen##
select id [Post Link]
     , score
     , creationdate
     , lastactivitydate
     , closeddate 
     , owneruserid as [User Link]
from posts
where body like concat('%', @search, '%') collate SQL_Latin1_General_CP1_CI_AI
or title like concat('%', @search, '%') collate SQL_Latin1_General_CP1_CI_AI
Run Code Online (Sandbox Code Playgroud)

双数字符号##在那里是什么意思?

我猜这是某种字符串语法,但我什至无法猜测它的关键字。谷歌搜索“SQL中的数字符号##”返回“前缀临时表”,事实并非如此。

sql-server stack-exchange-data-explorer

11
推荐指数
1
解决办法
2877
查看次数

断开数据库用户和 SQL Server 登录名之间的链接

将数据库从一个实例还原到另一个实例时,有时必须将 SQL Server 登录名重新链接到数据库用户。

这通常是通过以下程序之一来实现的。

不推荐使用的 sp_change_users_login 存储过程

use <database>
go
sp_change_users_login 'Update_one', '<datbase_user>', '<sql server login>' 
go
Run Code Online (Sandbox Code Playgroud)

更改用户命令

use <database>
go
ALTER USER [<datbase_user>] WITH LOGIN = [<sql server login>]
go
Run Code Online (Sandbox Code Playgroud)

这些命令会将孤立的数据库用户重新链接到相应的 SQL Server 登录名。

是否可以在不删除 SQL Server 登录名或数据库用户的情况下打破这种关系?

原因

  • 删除数据库用户将删除数据库中的权限。
  • 删除 SQL Server 登录名将删除密码。(散列值;DBA 未知)
  • 我将数据库用户链接到作为Windows 系统帐户的 SQL Server 登录名。

研究

我已经查看了DMVsys.database_principalssys.server_principalsDMV,但它们不可修改。

security sql-server permissions sql-server-2016

11
推荐指数
2
解决办法
838
查看次数

我应该从数据库角色 db_owner 中删除 dbo 吗?

我今天对我的数据库进行了漏洞评估。我找到了 VA2108,它建议我

ALTER ROLE [db_owner] DROP MEMBER [dbo]
Run Code Online (Sandbox Code Playgroud)

但它是任何 SQL 实例的默认设置。

我应该去吗?有什么风险吗?

在此处输入图片说明

谢谢

security sql-server azure-sql-database vulnerability-assessment

11
推荐指数
2
解决办法
1953
查看次数

有没有简单的方法来添加只读用户?

我有一个托管(共享)SQL Server 数据库,我想添加只读登录名。(此登录名将用于构建 Power BI 数据可视化。)

仔细研究一下,事情比我想象的要复杂得多。

理想情况下,来宾用户是只读的,我只需为来宾帐户添加登录信息即可。但该帐户最初似乎没有登录权限。

在此输入图像描述

有人可以提供最简单的方法(对数据库更改最少的方法)来添加具有只读访问权限的登录吗?

另外,有没有办法阻止访问某些表,例如我的用户成员资格表?

sql-server ssms users

11
推荐指数
1
解决办法
2万
查看次数

使用 INSTEAD OF 触发器合并到视图中

我有一个带有触发器的视图instead of,我尝试将其与 EF Core 一起使用,EF Core 尝试以merge语句的形式将批量插入一起。这是我的表格和视图:

create table tbl (id uniqueidentifier not null primary key, data nvarchar(max) null)
go
create view vwTbl as select * from tbl
go
create trigger vwTblInsert on vwTbl instead of insert as
    insert into tbl (id, data)
    select id, data
    from inserted
go
Run Code Online (Sandbox Code Playgroud)

以下是 EF 生成的近似 SQL:

declare @inserted1 table ([id] uniqueidentifier);
merge vwTbl using (
    values (newid(), 'xxx') 
) as i (id, data) on 1=0
when not matched then …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server entity-framework merge sql-server-2019

11
推荐指数
2
解决办法
1807
查看次数

SQL Server 使用的 RAM 比应有的多得多

我有一个 SQL Server 2012 实例使用了更多的 RAM。

SQL Server 进程使用大约 22.5GB RAM:

任务管理器

该实例配置为最大使用 10GB:

SSMS 内存属性

这比预期的要多得多。(这将导致服务器崩溃,我们必须重新启动才能恢复)。

我用这个查询检查了内存使用情况(职员):

select type, name, pages_kb/1024.0/1024.0 "size Gb" from sys.dm_os_memory_clerks
order by pages_kb desc 
Run Code Online (Sandbox Code Playgroud)

SQL Server 似乎只使用了大约 7GB RAM:

查询结果

我知道它是 SQL Server 的旧版本(遗憾的是它没有修补到最新版本),但我无法找到有关 SQL Server 2012 SP2 中内存泄漏的任何明确文档。

我应该在哪里查找为什么 SQL Server 使用了大约 200% 的资源?

此实例上有一个链接服务器。很多使用 SQL 驱动程序(SQLNCLI 和 SQLNCLI11),但也有一些使用我以前从未见过的“HFSQL 的 PC SOFT OLE DB 提供程序”。

有什么方法可以“证明”这个驱动程序有问题吗?客户端可能不会同意基于假设更改设置,因此如果有任何方法(除了禁用之外)可以清楚地显示链接服务器正在使用多少 RAM,那将是无价的。

@Aleksey:这就是产品返回的内容 在此输入图像描述

sql-server memory sql-server-2012

11
推荐指数
2
解决办法
2931
查看次数

如果禁用内存中的锁定页面选项,大内存服务器中会出现非生成调度程序错误

我们在 SQL Server VM 上看到许多非生成调度程序错误。阅读 Microsoft Docs 上的此链接,建议我们启用内存中的锁定页面。

我对内存中的锁定页面没有太多经验,并且我读过很多博客文章,其中对打开它表示谨慎。

服务器详细信息

  • Windows 服务器 2016
  • SQL Server 2017 CU27
  • 504 GB 总内存
  • 64核
  • 43GB 页面文件
  • 最大服务器内存设置为 460 GB
  • 最大DOP 16

我正在向具有内存锁定页面经验的人寻求建议,特别是在具有大内存的虚拟机上。或者是否还有其他我没有想到的选择?

sql-server wait-types sql-server-2017

11
推荐指数
1
解决办法
3165
查看次数

如果不满足限制,则将默认行添加到查询结果中

我有一个 SQL 查询,用于在表中查找某个日期范围内的值。

如果没有找到记录,我想生成具有默认值的行。

表现有记录之一的示例:

设备ID 时间 语境 价值
1 2022-02-10 连接的 错误的

因此,限制时间列在 2022-02-07 和 2022-02-10 之间的查询必须为 2 月 7 日、8 日和 9 日创建假行,但不能为 10 日创建假行,因为该行已经存在。

预期结果:

设备ID 时间 语境 价值
1 2022-02-7 伪造的 错误的
1 2022-02-8 伪造的 错误的
1 2022-02-9 伪造的 错误的
1 2022-02-10 连接的 错误的

我怎样才能做到这一点?使用递归 CTE?

sql-server date-math

11
推荐指数
3
解决办法
3179
查看次数

varchar(8000) 和 nvarchar(4000) 的限制是因为 sql server 页面大小(8KB=8192 字节)吗?

我知道 varchar(max) 和 nvarchar(max) 允许保存最多 2GB 的数据,但这与这个问题无关。

一个页面 8KB = 8192 字节

在 varchar 中,1 个字符就是 1 个字节。而在 nvarchar 中,1 个字符是 2 个字节。

varchar 允许有 8000 个字符(8000 字节)。而 nvarchar 允许有 4000 个字符(8000 字节)。

这是因为页面大小是 8192 字节吗?

sql-server

11
推荐指数
2
解决办法
1万
查看次数

为什么 SQL Server 能够准确跟踪某些多语句表值函数查询计划的时间,而其他查询计划则不然?

设置

在本演示中,我使用的是2013 版 Stack Overflow 数据库和 SQL Server 2022 CTP2,但回溯到 SQL Server 2017 也是有效的,这是我想检查的最早版本。

功能一

对于此函数,SQL Server 跟踪该函数所花费的执行时间:

CREATE OR ALTER FUNCTION
    dbo.ScoreStats
(
    @UserId int
)
RETURNS
    @out table
    (
        TotalScore bigint
    )
WITH SCHEMABINDING
AS 
BEGIN

    INSERT
        @out
    (
        TotalScore
    )
    SELECT
        TotalScore = 
            SUM(x.Score)
    FROM 
    (
        SELECT
            Score = 
                SUM(p.Score)
        FROM dbo.Posts AS p
        WHERE p.OwnerUserId = @UserId

        UNION ALL

        SELECT
            Score = 
                SUM(c.Score)
        FROM dbo.Comments AS c
        WHERE c.UserId = @UserId    
    ) AS x; …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan functions

11
推荐指数
1
解决办法
829
查看次数