假设您尝试运行以下查询:
SELECT *
FROM dbo.Customers c
WHERE id = @id
AND dateTimeCreated = @date
您将收到一条错误消息,如下所示Must declare the scalar variable "@id".
据我了解,这发生在查询的初始解析期间,在执行任何代码之前。
是否可以让 SQL Server 一次报告所有丢失的变量,或者这正是查询解析器的工作方式?
假设您尝试运行以下查询:
SELECT *
FROM dbo.Customers c
WHERE id = @id
AND dateTimeCreated = @date
您将收到一条错误消息,如下所示Must declare the scalar variable "@id".
据我了解,这发生在查询的初始解析期间,在执行任何代码之前。
是否可以让 SQL Server 一次报告所有丢失的变量,或者这正是查询解析器的工作方式?
SQL Server 2016 引入了STRING_SPLIT,它速度非常快,是人们在 2016 年之前推出的任何自制实现的绝佳替代品。
不幸的是,STRING_SPLIT 仅支持单字符分隔符,这并不总是足够的。有谁知道允许在分隔符中使用多个字符的良好实现?
我有两个计划每天运行一次的 T-SQL 脚本。两者都从不同的表中清理一些旧数据。两个脚本都以同一用户的身份在同一数据库上运行。
脚本 A 将在 SQL Server Management Studio 和作为作业启动时成功执行,但脚本 B 仅在 SQL Server Management Studio 中成功执行,即使以与设置为在 SQL Server 下运行脚本相同的用户身份登录也是如此代理人。
脚本 B 失败并出现以下错误:
作为用户 [用户名] 执行。
DELETE 失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'。验证 SET 选项对于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作是否正确。
[SQLSTATE 42000](错误 1934)。步骤失败。
我在我要清理的一个表上确实有一个过滤索引,但为什么它会通过 SSMS 工作?
我从这里下载了基于 AdventureWorks 的 In-memory 示例,并按照随附文档中描述的所有步骤进行操作。但是,当我尝试在 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
由于这是(或多或少)微软官方文档,我假设这是我做错了,但我无法弄清楚它是什么。
我想我可以使用 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;
'
如果我在未注释 PRINT 行的情况下运行上述查询,我会得到除系统数据库之外的所有数据库的列表。但是,当我取消注释 ALTER DATABASE 行时,我收到以下两条错误消息:
消息 5058,级别 16,状态 2,第 9 行
选项 'AUTO_SHRINK' 无法在数据库 'master' 中设置。
消息 5058,级别 16,状态 1,第 9 行
选项 'AUTO_SHRINK' 无法在数据库 'tempdb' 中设置。
这似乎在某些时候中断了操作,因此只有一些数据库被禁用自动收缩。
知道如何在所有数据库上禁用自动收缩吗?额外的问题:为什么我的方法不起作用?
我是一个偶然的 DBA,作为一名开发人员,从一个对数据库管理知之甚少的人那里继承了几个数据库服务器(2005 年和 2008 年),而且似乎对了解更多关于该主题的兴趣更小。
我边走边学,目前正在尝试找出事务日志文件。
我们所有的数据库都设置了简单的恢复模型和自动收缩。我知道使用自动收缩通常是一个可怕的想法,但我的理解是这样做是为了阻止事务日志失控。(自动收缩实际上是收缩日志文件还是仅仅收缩数据库?)
我在 SQL Server 2012 中发现了这一点,并且想知道关于 2005 年和/或 2008 年是否属实,以及它的确切含义:“当数据库使用简单恢复模型时,数据库引擎会在检查点之后截断事务日志。[. ..] 当虚拟日志已满 70% 时,数据库引擎会在简单恢复模式下触发自动检查点。” 虚拟日志大小在哪里指定?
我想在所有数据库上禁用自动收缩,但在我这样做之前,我需要知道日志文件不会很快失控。
任何帮助将不胜感激。
我正在使用一个表,其中事件的日期和时间以 YYYMMDDHHmmSS 或“20120606122012”格式存储为字符。我需要将此与当前时间戳进行比较,以查看事件发生后是否超过 20 分钟,但这似乎比我预期的要困难。
是否有可能做到这一点,或者如果没有:是否有不同的方法有效?
我认为在运行自定义系统存储过程时使用哪个数据库时我缺少一些东西。我的存储过程中有以下内容(为简洁起见进行了编辑):
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
问题是当我从 mydb 调用过程时,主表用于初始检查,而不是当前数据库。如果我编写 mydb.INFORMATION_SCHEMA.TABLES 它可以工作,但这并不是真正的解决方案,因为它破坏了将其维护为单个 SP 而不是每个 DB 一个 SP 的全部意义。
有任何想法吗?我尝试将 DB 名称作为参数传递并使用“use @db_name”启动 SP,但显然存储过程不允许使用语句。
提前感谢所有帮助。