我已经从这里下载了基于 AdventureWorks 的内存示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在 SQL Server Management Studio 中运行脚本时,我收到错误消息:
多语句事务中不允许使用 ALTER DATABASE 语句
错误指向第 9 行,即:
IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod]
CONTAINS MEMORY_OPTIMIZED_DATA
GO
Run Code Online (Sandbox Code Playgroud)
由于这是(或多或少)微软官方文档,我假设这是我做错的事情,但我无法弄清楚它是什么。
SQL Server 2016 引入了STRING_SPLIT,它非常快,是人们在 2016 年之前推出的任何自制实现的绝佳替代品。
不幸的是,STRING_SPLIT 只支持单字符分隔符,这并不总是足够的。有谁知道允许在分隔符中使用多个字符的良好实现?
我是一个偶然的 DBA,作为一名开发人员,从对数据库管理知之甚少的人那里继承了几台数据库服务器(2005 年和 2008 年),而且似乎对了解更多有关该主题的兴趣更小。
我正在学习,目前正在尝试找出事务日志文件。
我们所有的数据库都设置了简单的恢复模型和自动收缩。我知道使用自动收缩通常是一个可怕的想法,但据我所知,这样做是为了防止事务日志失去控制。(自动收缩实际上是收缩日志文件还是仅仅收缩数据库?)
我在 SQL Server 2012 上发现了这个,并且想知道 2005 年和/或 2008 年是否属实,以及它的确切含义:“当数据库使用简单恢复模型时,数据库引擎会在检查点之后截断事务日志。[。 ..] 当虚拟日志已满 70% 时,数据库引擎会在简单恢复模型下触发自动检查点。” 在哪里指定虚拟日志大小?
我想在所有数据库上禁用自动收缩,但在我这样做之前,我需要知道日志文件不会很快失控。
任何帮助将不胜感激。
我想我可以使用 sp_MSforeachdb 来解决这个问题,但我收到一条错误消息。
sp_MSforeachdb '
BEGIN
USE [?]
DECLARE @dbid INT
SET @dbid = DB_ID()
IF(@dbid > 4)
BEGIN
--PRINT ''[?]'' + CONVERT(VARCHAR, @dbid)
--ALTER DATABASE [?] SET AUTO_SHRINK OFF
END
END;
'
Run Code Online (Sandbox Code Playgroud)
如果我在未注释 PRINT 行的情况下运行上述查询,我将获得除系统数据库之外的所有数据库的列表。但是,当我取消注释 ALTER DATABASE 行时,我收到以下两条错误消息:
消息 5058,级别 16,状态 2,第 9 行
无法在数据库“master”中设置选项“AUTO_SHRINK”。
消息 5058,级别 16,状态 1,第 9 行
无法在数据库“tempdb”中设置选项“AUTO_SHRINK”。
这似乎在某些时候中断了操作,因此只有一些数据库被禁用自动收缩。
知道如何在所有数据库上禁用自动收缩吗?额外问题:为什么我的方法不起作用?
我认为在运行自定义系统存储过程时,在使用哪个数据库时,我缺少一些东西。我的存储过程中有以下内容(为简洁起见进行了编辑):
ALTER PROCEDURE sp_mysp
AS
IF (EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytable'))
BEGIN
--Do stuff to the table
END
ELSE
BEGIN
PRINT 'Table mytable does not exist'
END
Run Code Online (Sandbox Code Playgroud)
问题是当我从 mydb 调用该过程时,主表用于初始检查,而不是当前数据库。如果我编写 mydb.INFORMATION_SCHEMA.TABLES 它可以工作,但这并不是真正的解决方案,因为它破坏了将其作为单个 SP 而不是每个 DB 一个 SP 的全部意义。
有任何想法吗?我尝试将 DB 名称作为参数传递并使用“use @db_name”启动 SP,但显然存储过程不允许使用语句。
在此先感谢所有帮助。
我有两个 T-SQL 脚本,它们计划每天运行一次。两者都清理不同表中的一些旧数据。两个脚本都以同一用户身份在同一数据库上运行。
脚本 A 将在 SQL Server Management Studio 和作为作业启动时成功执行,但脚本 B 将仅在 SQL Server Management Studio 中成功执行,即使以设置为在 SQL Server 下运行脚本的同一用户登录代理人。
脚本 B 失败并出现以下错误:
以用户 [username] 身份执行。
DELETE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。
[SQLSTATE 42000](错误 1934)。步骤失败。
我在尝试清理的表之一上确实有一个过滤索引,但为什么它会通过 SSMS 工作?
我正在处理一个表,其中事件的日期和时间以 YYYMMDDHHmmSS 或“20120606122012”格式存储为字符。我需要将其与当前时间戳进行比较,以查看自事件发生以来是否已经超过 20 分钟,但这似乎比我预期的要困难。
是否可以这样做,或者如果不能:是否有不同的方法有效?