标签: sql-server

可以在数据库级别设置 IMPLICIT_TRANSACTIONS 吗?

当我必须调查由 IMPLICIT_TRANSACTIONS ON 引起的问题时,我可以专注于客户端工具设置 IMPLICIT_TRANSACTIONS ON 或 ANSI_DEFAULTS ON 还是可以针对影响所有客户端的整个数据库进行设置?

我可以通过将标准脚本头更改为来避免该问题

SET ANSI_DEFAULTS ON
SET IMPLICIT_TRANSACTIONS  OFF
Run Code Online (Sandbox Code Playgroud)

但是这个设置会在哪些级别的会话、数据库、服务器上受到影响呢?

编辑:

在msdn中找到了这个

似乎可以在服务器级别进行设置。

在“服务器属性”对话框(“连接”页面)中,我发现选项已更改并编写了脚本:

隐式交易:

EXEC sys.sp_configure N'user options', N'2'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)

隐式交易关闭:

EXEC sys.sp_configure N'user options', N'0'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)

但执行

exec('dbcc useroptions')
Run Code Online (Sandbox Code Playgroud)

SSMS中没有反映变化。对于此类连接,服务器设置似乎以某种方式被覆盖。

现在我必须重新提出这个问题,

是否有客户端不会覆盖服务器设置,并且在服务器设置更改时可能会崩溃。

sql-server-2008 sql-server

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

tempdb日志和数据库日志有什么区别?这些日志文件在什么情况下使用?

众所周知,每当执行任何大型查询时,就会出现两种类型的日志文件 (*.ldf):1. 数据库日志(事务日志)文件 2. tempdb 日志。

请描述一下 SQL Server 在执行任何查询时如何使用这些文件?

我想知道的第二件事是,什么时候收缩日志文件(数据库日志、tempdb 日志)是安全的?在什么情况下我们不应该记录文件?

sql-server-2008 sql-server

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

强制假脱机避免创建临时表?

我有以下查询,它连接几个非常大的表的透视数据,并且运行速度非常慢。我尝试为每次旋转创建临时表,它运行得更快。这是一种在不创建临时表的情况下强制索引/表假脱机的方法吗?

select ...
from T1 ....
left join (select ... from (select ... from T2....) pivot (sum(C1) on C2 in (...))) p1 
    on ...
left join (select ... from (select ... from T3....) pivot (sum(...) on ... in (...))) p2
    on ...
left join (select ... from (select ... from T4....) pivot (sum(...) on ... in (...))) p3
    on ...
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

用破折号对字母数字值进行排序

我定义了一个名为 Inventory 的表,其中包含一个varchar(45)名为ItemNameCode. 这是表格,包含以下字母数字值。

在此处输入图片说明

我们要按字母数字排序为:

MES40
PT14
PT14-403
PT14-646-649
PT14-646-649
PT15-3-11
PT15-12-42
PT15-12-572-575
PT16-164
PT16-227
PT16-62-71
PT16-136
PT16-137
Run Code Online (Sandbox Code Playgroud)

我尝试了波纹管查询,但没有得到确切的顺序:

SELECT ItemNameCode
FROM Inventory
ORDER BY LEFT(ItemNameCode,PATINDEX('%[0-9]%',ItemNameCode)-1)
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 sql-server-2014

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

SQL Server 自动关闭选项

对于具有超过 15,000 个具有相同结构的数据库的环境,AutoClose ON 是否是一个糟糕的选择?
我知道我们应该在 99.99% 的情况下将此作为最佳实践。那么这是该功能适用​​的一种边缘情况吗?
在这样的情况下,我们应该注意什么并改进?

database-design sql-server

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

Force_legacy_cardinality_estimation 提示问题

  1. force_legacy_cardinality_estimation 提示是否会更改整个查询(或存储过程)的基数或仅更改其应用的代码部分?(例如,如果存储过程中有多个 SELECT 语句,但提示仅在其中一个 SELECT 语句上。)
  2. 您可以在视图中使用提示吗?

sql-server sql-server-2019

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

如何在管理工作室选项卡中重置会话?

在管理工作室选项卡中,假设我运行创建临时表的代码。

现在,如果我重新运行此代码,则会出现临时表已存在的错误。我可以打开一个新选项卡并运行此代码。发生这种情况是因为每个选项卡都是一个新会话。

我知道使用 drop 作为代码的初始部分是一种解决方案。但是,有什么方法可以在同一窗口中获取新会话(或重置会话),以便在重新运行代码时不必创建新选项卡?

sql-server ssms

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

展开日期范围

我有下表,其中包含以下数据:

DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)

INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00')
INSERT INTO @MyActions VALUES (2, '2021-08-02 02:00:00')
INSERT INTO @MyActions VALUES (3, '2021-08-03 03:00:00')
INSERT INTO @MyActions VALUES (4, '2021-08-04 04:00:00')
Run Code Online (Sandbox Code Playgroud)

如何在不使用慢表值函数的情况下将每个 ActionID 分解为 10 个附加记录(当前 ActionID 的日期前 5 天和日期后 5 天)?

ActionID = 1 应该爆炸到 11 个总记录(没有时间),Action 2 应该爆炸到 11 个总记录(没有时间),依此类推

分解结果集

DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)

INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00') …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014 date-math

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

保留每个表中每个值的完整历史记录

您将如何保留数据库中所有表的每个值的完整历史记录,可以使用特定日期(对于所有表的每一列)进行查询?我的意思是:人们只需要指定一个日期,该日期的值是“活动”或“有效”。

以一种愚蠢的方式,我会在每个表中添加一个“有效期开始日期”列。而不是复制每个值,我只会复制更改的值,并将所有其他列设置为 NULL。然而,这个解决方案真的很糟糕,因为它使查询复杂化,即使它占用的空间更少。

是否有一种特定的技术(我在 Microsoft 世界中)可以做到这一点,或者有一种特定的方法来为数据库建模来做到这一点(除了为每个表的每一列创建一个表)?

我想提一下,我不是 DBA 而是开发人员。赞!赞!

database-design sql-server t-sql

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

是否可以更改驱动器名称/标签(不是驱动器号!)

我意识到这可能是一个简单的问题,但如果我包含 SQL Server,我的搜索只会返回驱动器号或数据库名称的结果。请随时向我指出现有的文章或答案,并提前道歉:)

我继承了一个环境,其中包含多个支持多个 SharePoint 2013 和 2016 场的 SQL Server 2014 和 2016 服务器(也有一些是集群服务器)。以前的 SA 为驱动器命名/标记了一些相当模糊的名称,我想通过重命名驱动器来避免自己继续混淆每个包含的内容。这是一个坏主意吗?我似乎无法在我的环境中找到任何专门提到驱动器名称的东西,一切似乎都选择了驱动器号,在某些情况下,驱动器名称被呈现为信息。

驱动器名称只是一个描述,实际上并没有将驱动器本身识别为任何系统,我对吗?

sql-server sharepoint sql-server-2014 sql-server-2016

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