标签: sql-server-2016

此查询计划中没有 IMPLICIT_CONVERSION 警告

采用以下最低限度完整且可验证的示例1代码:

USE tempdb;

DROP TABLE IF EXISTS dbo.t;
GO
CREATE TABLE dbo.t
(
    t_id int NOT NULL
        CONSTRAINT t_pk
        PRIMARY KEY 
        CLUSTERED
        IDENTITY(1,1)
    , k sysname NOT NULL
        INDEX t_001
    , s sysname NOT NULL
        INDEX t_002
    , somedata varchar(1000) NOT NULL
        CONSTRAINT t_somedata_df
        DEFAULT REPLICATE('A', 1000)
    , INDEX t_003 (k, s)
);

INSERT INTO dbo.t (s, k)
SELECT sc1.name, sc2.name
FROM sys.syscolumns sc1
    CROSS JOIN sys.syscolumns sc2;

CREATE STATISTICS t_st001 ON dbo.t (k) WITH FULLSCAN;
CREATE …
Run Code Online (Sandbox Code Playgroud)

sql-server type-conversion sql-server-2016 cardinality-estimates

4
推荐指数
1
解决办法
135
查看次数

查找系统运行状况文件何时滚动的方法

有没有办法在系统健康扩展事件文件滚动时找到事件,而不是手动监视事件?

对于我的中等负载服务器,它们最多可停留 2-3 天。但是对于负载较重的服务器,这些文件每 15 分钟左右滚动一次,但没有固定的模式或时间。我们知道原因并努力过滤掉不需要的事件或报告为问题的事件。

我很好奇是否有一种方法可以查询文件翻转发生的时间。我也没有在 MS 文档上看到太多文档,但找不到此信息?

请建议它是否可能以及如何?

sql-server extended-events sql-server-2016

4
推荐指数
2
解决办法
569
查看次数

软件需要数据库所有者权限才能主数据库(sql2016)

我们有一个制造商,其软件需要对主数据库进行授权(仅数据库所有者工作)。不幸的是,制造商无法告诉我们为什么需要访问主数据库。没有此权限,应用程序将不会启动。

你有什么意见?你见过这样的软件吗?我们有 200 个不同的应用程序,但这是第一个需要永久访问的应用程序

对安全有异议吗?

作为替代方案,我们可以安装 SQL Express 实例,因为数据库非常小。如果从您的角度访问主数据库不是一个好主意。

security sql-server sql-server-2016

4
推荐指数
1
解决办法
767
查看次数

如何检测更改范围配置的内容?

我注意到我有一个不断重置范围配置的数据库,即 maxdop。

是否有任何日志显示谁或什么进程导致这些配置更改?我使用的是 Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) - 13.0.4466.4

sql-server sql-server-2016

4
推荐指数
1
解决办法
66
查看次数

如何编写用户定义的表类型的脚本?

我可以 使用以下任一脚本获取所有表类型的名称和定义

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


IF OBJECT_ID('TEMPDB..#RADHE') IS NOT NULL
   DROP TABLE #RADHE

CREATE TABLE #RADHE
(
 RADHE SYSNAME,
 COLUMN_NAME SYSNAME,
 TYPE_COLUMN SYSNAME,
 PRIMARY KEY CLUSTERED (RADHE,COLUMN_NAME)
 )

DECLARE @sql nvarchar(max) = N'', 
  @stub nvarchar(max) = N'SELECT [RADHE]=N''$--RADHE--$'', 
   COLUMN_NAME=name, TYPE_COLUMN=system_type_name
   FROM sys.dm_exec_describe_first_result_set(''DECLARE 
   @tvp $--RADHE--$; SELECT * FROM @tvp;'',null,null)
   ORDER BY column_ordinal;';

SELECT @sql += REPLACE(@stub, N'$--RADHE--$', 
  QUOTENAME(s.name) + N'.' + QUOTENAME(t.name))
FROM sys.table_types AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id];

INSERT …
Run Code Online (Sandbox Code Playgroud)

sql-server scripting sql-server-2016 user-defined-table-type automation

4
推荐指数
1
解决办法
2329
查看次数

是否有运算符或简单的方法将表达式与 SQL 中的 LIKE 运算符匹配一次或多次?

例如,如果我运行以下查询,WHERE 子句中的表达式将只匹配数字前的第一个字母,但有没有办法先匹配一个或多个字母(例如,在字母数量可变的情况下)在我过滤的字段中的数字之前)?

SELECT FilteredField
FROM Table
WHERE FilteredField LIKE '[a-zA-Z][0-9]'
Run Code Online (Sandbox Code Playgroud)

示例数据:

  1. ABC9
  2. DEF2
  3. GH7
  4. Z1
  5. XYH2

本质上,当使用 LIKE 运算符时,我正在寻找与 RegEx +等效的 SQL Server 2016 。

sql-server regular-expression t-sql regex sql-server-2016

4
推荐指数
1
解决办法
686
查看次数

sysmessages 表问题

我在我们的一个数据库中遇到了一个名为 SysMessages 的表的烦人问题。当我运行一个 select 语句时,我没有得到这个表的内容,而是主数据库中 sys.sysmessages 视图的内容。Ause [DBNAME]没有帮助,也没有select * from [DBNAME].dbo.SysMessages

我正在迁移到更新的 SQL Server 版本。在 SQL Server 2008 R2 中,我没有遇到此数据库的问题,但在 SQL Server 2016 中,我无法查询自己的 SysMessages 表。

任何帮助将不胜感激。

sql-server sql-server-2016

4
推荐指数
1
解决办法
119
查看次数

如果 sp_ExecuteSql 创建一个新会话,我怎么可以访问在动态 SQL 之外创建(在执行之前)的本地临时表?

如果本地临时表仅对当前会话可用,并且 sp_ExecuteSql 创建一个新会话来执行传递给它的动态 SQL 字符串,那么该动态 SQL 查询如何访问在执行 sp_ExecuteSql 的会话中创建的临时表。

换句话说,为什么这样做:

SELECT 1 AS TestColumn
INTO #TestTempTable

DECLARE @DS NVARCHAR(MAX) = 'SELECT * FROM #TestTempTable'
EXEC sp_EXECUTESQL @DS
Run Code Online (Sandbox Code Playgroud)

结果:

动态 SQL 选择的临时表结果

我之所以不能做相反的事情(在动态 SQL 中创建临时表,然后在执行会话中的动态 SQL 查询之外访问它),我的理解是因为 sp_ExecuteSql 在新会话下执行。

sql-server dynamic-sql session temporary-tables sql-server-2016

4
推荐指数
1
解决办法
670
查看次数

查询执行计划很糟糕,直到更新统计信息

我希望你们能在这里帮助我。我们的应用程序每 3 秒轮询一次消息表,寻找要发送的通知。这适用于我们所有的客户(单租户数据库),除了一个。他们将一天 23 小时没有活动,然后一次加载数千条消息(3000+)。在其他情况下,这个卷什么都不是,我们可以轻松处理它,除了在这种情况下,下面的 SQL 查询需要大约 30 秒才能运行,并且随着队列在更新时备份而变得更糟,需要排他锁和因此阻止所有其他查询,因此问题会导致各种破坏。这都是由于糟糕的查询计划造成的。

我们每天早上 5 点进行每日重新索引(重组 < 30%,重建 > 30%,忽略 <5%)以及更新统计信息。这些都来自 Ola Hallengren 维护解决方案。我们也在 SQL Server 2016 上并且完全是最新的 (13.0.5492.2)

我手头没有这 2 个计划,但基本上坏计划会执行 MessagesSent 表(3.5m 行)的全表扫描。

我的理论是,由于查询一整天都没有返回任何内容,因此某些部分没有执行,因此错误查询是最有效的 SQL 查询。

这将在刷新查询计划后继续,因为它只生成相同的计划,但是当我在 MessagesSent 表上更新统计信息时,创建好的计划并且一切正常,查询在大约 10-30 毫秒内执行。

有谁知道我如何微调它以始终使用更好的计划,即使查询返回的数据不存在?作为修补程序,我们向应用程序添加了重新编译选项,但我认为这不是每 3 秒执行一次的查询的理想解决方案。

这是查询:

WITH TopMessage
    AS
    (
        SELECT TOP 1 ID, BatchID FROM MessagesSent 
        JOIN Units ON Unit = idUnit 
        WHERE   MessageDate <= GETDATE() 
          AND         Active = 'True' 
          AND         Status = 'Queued' 
          AND NOT(DialString = 'null') 
          AND           Unit = ('29') …
Run Code Online (Sandbox Code Playgroud)

sql-server statistics execution-plan sql-server-2016

4
推荐指数
2
解决办法
673
查看次数

SQL Server 链接服务器最佳实践 - 分步

您好,感谢您的光临。我是一个偶然的 DBA,正在寻找以正确方式创建链接服务器的一些指导。MS 提供了数据类型的完整描述以及 sp_addlinkedserver、sp_addlinkedsrvlogin 和 sp_serveroption 的所有各种参数的描述,但没有关于如何将各种选项对齐为给定情况的最佳实践的指导。

我有其他 DBA 的例子,他们只是使用了“sa”密码,但我的研究表明我应该使用针对他们的链接服务器用途量身定制的登录。问题是我到目前为止无法找到正确的组合和顺序(操作顺序)来正确创建所有部件和部件,从而导致链接服务器允许两台服务器之间进行有限的通信。

目标:在源服务器之间创建一个链接服务器,这将允许来自源服务器的作业步骤检查某些条件,如果为 TRUE,则在目标服务器上调用 sp_start_job。...仅此而已

根据建议,我在源和目标上创建了两个相同名称/密码的 SQL 身份验证登录,两者都具有有限的“公共”权限。

我创建了链接服务器,试图将本地登录映射到远程登录(想想如果我做到了,我会仔细修改目标登录的权限以找到允许它执行 sp_start_job 的权限)。

但到目前为止,我唯一的奖励是一系列各种类型的失败通知。

有大量在线文档解释了每个不同的 proc/param 的作用,但我很难找到某种概述来解释 procs/params 的组合如何导致不同的预期结果。

我希望得到一些有用的建议,参考一些“尚未发现”的教程,或者甚至是关于如何实现我的目标和培养一点自尊的分步说明。(到目前为止,这项任务除了挫伤我的自尊心之外什么也没做!)

感谢您的时间。

sql-server best-practices linked-server sql-server-2016

4
推荐指数
1
解决办法
622
查看次数