标签: sql-server

检查约束以强制执行###.###.#### 模式匹配

我想要一个检查约束,为多部分代码强制执行此正则表达式模式:

^\d{3}\.\d{3}\.\d{4}$
Run Code Online (Sandbox Code Playgroud)

...三个数字,一个句号,三个数字,一个句号,四个数字。

我是否需要创建一个 CLR 函数来强制执行模式匹配,并且可以在 DDL 中引用 CLR 函数吗?

有没有办法以另一种方式强制执行模式,使用LIKE?

sql-server constraint sql-server-2012

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

安装后配置管理器中缺少 SQL Server 网络配置节点

我有一台运行 Windows 2012 R2 Datacenter 64 位的服务器。我使用 SQL 2016 RC3 没有问题,我想用我们从 MSDN 获得的 RTM 版本替换它。

卸载RC3然后安装RTM后,我无法远程连接到服务器。经过检查,我在配置管理器中看到“SQL Server 网络配置”没有节点。列出了 32 位版本,并启用了 TCP/IP。如何安装这个缺失的节点?

我已启动 SQL Browser 服务并尝试修复 2016 安装。似乎没有什么可以恢复这个缺失的组件。 在此处输入图片说明

我发现有趣的是,我无法卸载 RC3 和 RTM 安装的某些部分。我不确定这是否相关。我按照微软关于卸载 SQL Server 的说明进行操作,所以我觉得我做的一切都是正确的。 在此处输入图片说明

sql-server installation sql-server-2016 configuration-manager

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

SQL Server - NTEXT 列和字符串操作

我有一个表,其中有一NTEXT列名为comments. 我有第二个字符串,我们称之为anothercomment(a varchar),它需要放在comments单词 之后的给定字符串中UPDATEHERE

强制转换会nvarchar(max)截断comments字符串,因此我不能使用CHARINDEX()( Msg 8152, Level 16, State 10, Line 2 String or binary data would be truncated.)。我曾经datalength()检查过是否有几千列 > 8000 个字符。

我想要实现的示例(尽管字符串更长):

注释 - This is a test UPDATEHERE This is the end of the test

另一个评论—— . This is inserted.

结果字符串 - This is a test UPDATEHERE. This is inserted. This is the end of the test …

sql-server sql-server-2008-r2 string

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

为什么 COUNT() 为“NULL”聚合返回 0?

SELECT 语句返回几行:

SELECT
  ColA
FROM
  TableA
WHERE
  ColA IS NULL
Run Code Online (Sandbox Code Playgroud)

我在 TableA 中得到 47 行的 ColA 为“NULL”。

ColA
NULL
NULL
NULL
etc...
Run Code Online (Sandbox Code Playgroud)

如果我向这个查询添加一个聚合:

SELECT
  ColA,
  COUNT(ColA) AS theCount
FROM
  TableA
WHERE
  ColA IS NULL
GROUP BY ColA
Run Code Online (Sandbox Code Playgroud)

我得到

ColA | theCount
NULL | 0
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该怎么做才能避免这种情况?

null sql-server aggregate

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

无法继续执行,因为会话处于终止状态。在构建聚集索引时

尝试创建聚集索引时出现以下错误

该语句已终止。
消息 596,级别 21,状态 1,第 0 行
无法继续执行,因为会话处于终止状态。

Msg 0, Level 20, State 0, Line 0
当前命令发生严重错误。结果,如果有的话,应该被丢弃。

指数是:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

CREATE CLUSTERED INDEX IX_CO_DES_INPUT 
ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME)
          WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
               ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

ALTER TABLE dbo.CO_DES_INPUT 
  SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Run Code Online (Sandbox Code Playgroud)

我在 Windows …

sql-server sql-server-2012

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

可以参与 SET 操作的局部变量的最大数量是多少?

我有一个包含业务逻辑的存储过程。在它里面我有大约 1609 个变量(不要问我为什么,这就是引擎的工作原理)。我尝试将SET一个变量连接到所有其他变量的连接值。结果在创建过程中出现错误:

消息 8631,级别 17,状态 1,过程 XXX,行 YYY 内部错误:已达到服务器堆栈限制。请在您的查询中寻找潜在的深层嵌套,并尝试简化它。

我发现错误是由于我需要在SET操作中使用的变量数量。我可以通过将其一分为二来执行任务。

我的问题是这方面有一些限制吗?我查了查,但没有找到。

我们检查了此 KB 中描述的错误,但这不是我们的情况。我们不在CASE代码中使用任何表达式。我们使用该临时变量来准备必须使用 CLR 函数替换的值列表。我们将 SQL Server 更新为 SP3 CU6(最新的),但我们仍然遇到错误。

sql-server t-sql database-internals sql-server-2012 errors

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

是否可以根据 SQL Server 版本选择 RAISERROR 或 THROW?

这是我现在的代码:

BEGIN TRY
INSERT INTO TABLE (F1,F2,F3) 
VALUES ('1','2','3')
END TRY
BEGIN CATCH
;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

效果很好,除非它在装有 SQL 2008 的机器上运行。我想让 CATCH 块检查 SQL 版本并运行 THROW(如果它等于或高于 2012 年),如果是 2008 年则运行 RAISERROR。我一直遇到语法错误,我想知道是否有可能。即使像这样简单的事情也不适合我。

BEGIN CATCH
IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏。

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

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

终止应用程序会终止 SQL 连接吗?

假设应用程序已与 SQL\xc2\xa0Server 建立了两个连接。

\n
    \n
  1. 会话正在主动运行查询
  2. \n
  3. 会话正在休眠,等待下一条指令
  4. \n
\n

通过任务管理器终止此应用程序是否会终止两个 SQL 连接?

\n

sql-server sql-server-2019

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

如果禁用非聚集索引,统计信息是否仍然使用?

tl;dr - 正如标题所述 - 如果我禁用表上的非聚集索引,是否仍使用该索引的链接统计信息?


我知道有很多关于“删除与禁用索引”的问题......但我找不到专门涵盖统计数据的问题。

我知道统计数据没有改变或改变(至少这是我从 MS 文档中收集到的)。但我的问题是统计数据是否仍然被使用


作为背景,我正在开展一个大型索引调整项目。它涉及在数百个相同的数据库中添加/删除索引,但工作负载模式各不相同。总共有超过 200 万个索引。

我的第一步是删除所有“未使用”的索引。然而,我并没有放弃它们,而是考虑禁用它们,以便保留定义。这将允许我在表中记录任何禁用索引的实例、数据库、对象 ID 和索引名称/ID。如果此后性能开始下降,可以重新启用(重建)索引。

但是,如果已禁用索引的统计信息仍用于生成计划...那么禁用它们不会产生与删除它们相同的性能影响。如果是这种情况,那么禁用索引并不是“真正的”性能影响测试,如果禁用的索引最终被删除,我可能会面临引入性能问题的风险。

index sql-server sql-server-2017

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

为什么 sys.fn_xe_file_target_read_file 需要对 datetime2 列进行显式转换?

根据文档,返回的列timestamp_utc应为datetime2(7)类型

但是当我这样查询时

SELECT 
    *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE timestamp_utc > dateadd(hour, -1, GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

它不返回任何行。仅当我向datetime2添加显式转换时,它才返回行

SELECT 
    *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE cast(timestamp_utc as datetime2(7)) > dateadd(hour, -1, GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

这与文档中的最后一个示例匹配(即使没有引起注意)

在此输入图像描述

这是为什么?

sql-server extended-events sql-server-2022

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