小编Tom*_*m V的帖子

有没有一种有效的方法来查看“字符串或二进制数据将被截断”的原因?

这是对这个问题的跟进。这也与微软的这个功能请求有关。

然而,许多年过去了,自从它被报道以来,有几个主要版本进入了市场。

问题: SQL Server 2017 是否提供任何机制来轻松找出此错误的根本原因?还是像大约 9 年前报告该问题时一样难以调查?

sql-server string sql-server-2017

13
推荐指数
1
解决办法
1788
查看次数

为什么会出现 async_network_io 等待类型?

上周我们的数据库发生了一些奇怪的事情。突然之间,应用程序阻止了我们无法保存新实体等的用户。在查看 SQL Server(2008 兼容模式 2005)的活动监视器后,我看到以下三个条目:

async_network_io 等待类型

一段时间后,用户出现连接超时。当我杀死进程64时,他们可以再次正常保存。

问题是他们在块期间尝试保存的实体被多次插入数据库(最多 3 次),即使有代码可以防止这种情况发生(数字列必须是唯一的但没有约束...检查发生在代码中)。

我们使用实体框架 6.0。

  • 你们中有人知道这些 ASYNC_NETWORK_IO 等待类型发生的原因和时间以及如何避免它们吗?
  • 它们究竟是什么意思?

sql-server-2008 sql-server entity-framework

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

查找数据库中所有表的未压缩大小

在 Dynamics AX 中有一个缓存机制,可以将表配置为加载到内存中并缓存。此缓存限制为一定数量的 KB,以防止出现内存问题。我正在谈论的设置被调用entiretablecache并在请求单个记录时将整个表加载到内存中。

直到最近,我们依靠一些脚本来验证具有此设置的表的大小,以查看表大小是否高于此限制。

然而,现在,压缩开始发挥作用,诸如sp_spaceusedsys.allocation_units 之类的东西似乎报告了压缩数据实际使用的空间。

显然,应用程序服务器正在处理未压​​缩的数据,因此 SQL Server 中磁盘上的数据大小无关紧要。我需要未压缩数据的实际大小。

我知道sp_estimate_data_compression_savings但正如名字所说,这只是一个估计。
我希望尺寸尽可能正确。

我能想到的唯一方法是一些复杂的动态 SQL 创建与压缩表具有相同结构的未压缩表,将压缩数据插入到影子表中,然后检查影子表的大小。
不用说,这有点乏味,在数百 GB 的数据库上运行需要一段时间。

Powershell 可能是一个选项,但我不想遍历所有表以select *对它们执行 a以检查脚本中的大小,因为这只会淹没缓存并且可能需要很长时间。

简而言之,如果可能的话,我需要一种方法来获取每个表的大小,因为它一旦被解压缩,并且在呈现给应用程序的等式中会出现碎片。我对不同的方法持开放态度,首选 T-SQL,但我不反对 Powershell 或其他创造性方法。

假设应用程序中的缓冲区是数据的大小。bigint 始终是 bigint 的大小,而字符数据类型是每个字符 2 个字节(unicode)。BLOB 数据也占用数据的大小,枚举基本上是一个整数,数字数据是 numeric(38,12),datetime 是日期时间的大小。此外,没有NULL值,它们要么存储为空字符串,要么存储1900-01-01为零。

没有关于如何实现的文档,但这些假设基于一些测试以及 PFE 和支持团队使用的脚本(显然也忽略了压缩,因为检查是在应用程序中构建的,而应用程序无法分辨)如果底层数据被压缩),它还检查表大小。例如,此链接指出:

避免对大型表使用 EntireTable 缓存(在 AX 2009 中超过 128 KB 或 16 页,在 AX 2012 中超过“整个表缓存大小”应用程序设置[默认值:32KB 或 4 页])——改为使用记录缓存。

sql-server size cache compression

12
推荐指数
2
解决办法
1498
查看次数

SQL Server Insert Into - 如何识别导致截断错误的列

我有一个将 650 个字段插入表中的存储过程。插入失败并出现截断错误。

这是一个简单的

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)
Run Code Online (Sandbox Code Playgroud)

下面是错误信息:

消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行 字符串或二进制数据将被截断。

有没有一种快速的方法可以识别导致截断错误的字段?

要插入表中的 select 语句有 650 个字段,因此很难确定哪个字段导致了截断错误。

我想我可以一次注释掉字段块,以便 SP 一次只插入 100 个字段,然后运行 ​​SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。

或者,我在想,也许我可以只创建SELECT INTO一个新表,然后将表中的数据长度与我尝试插入到我的 SP 中的目标表的数据长度进行比较,以查看哪个字段包含比预期更长的字段长度。 ..

我正在使用 SQL Server 2014。

有没有更简单的替代品?

sql-server stored-procedures t-sql sql-server-2014

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

获取父母的所有后代

我有一个包含两列的表,Parent并且Child.

我需要获取与父记录关联的所有后代的列表。

Source Table
+----+-----------+
| Parent | Child |
+----+-----------+
|  a     |     b |
|  b     |     c |
|  c     |     d |
|  d     |     e |
|  e     |     f |
|  f     |     x |
+----+-----------+

Expected Result:
+----+-----------+
| Parent | Child |
+----+-----------+
|  a     |     b |  // As b is the child of a, all the descendants of b 
|  a     |     c |  // are …
Run Code Online (Sandbox Code Playgroud)

recursive

10
推荐指数
1
解决办法
5万
查看次数

执行备份时,restore headeronly 有什么用?

当我使用以下查询监控我的备份时:

SELECT      command, percent_complete,
            'elapsed' = total_elapsed_time / 60000.0,
            'remaining' = estimated_completion_time / 60000.0
FROM        sys.dm_exec_requests
WHERE       command like 'BACKUP%'
or command like 'RESTORE%'
Run Code Online (Sandbox Code Playgroud)

我注意到在备份之前,SQL Server 只在备份之后执行还原标头。

我想知道它有什么用处,以及它的执行时间是否可以以某种方式减少。它似乎比实际备份花费的时间更长。

sql-server backup sql-server-2012

10
推荐指数
2
解决办法
2154
查看次数

如何从 SQL Server 2014 Express 连接到 localDB

我下载了适用于 MS SQL Server 2014 Express 的 LocalDB 和 Management Studio,以便我可以在本地机器上练习。但是,当我打开 Management Studio 并尝试浏览到 localDB 以连接到启动创建的数据库时,我无法找到 localDB。

有人可以帮助我吗?

sql-server installation sql-server-2014 sql-server-localdb

9
推荐指数
1
解决办法
3万
查看次数

从 SSMS 时态表中选择 TOP N Rows missing

我在我的数据库中使用时态表,当我在 Management Studio 2017 (v17.4 14.0.17213.0) 中右键单击我的表时,我没有在上下文菜单中看到选择前 1000 行(非时态表没有问题)

ssms 丢失选择顶部

任何想法如何让这个上下文菜单回来?我感觉这与我运行的 SQL Server 版本有关(SQL 13.1.4001.0 Express Edition)

sql-server ssms sql-server-2016 sql-server-2017

9
推荐指数
2
解决办法
1233
查看次数

为什么 EXEC 语句的 query_hash 为零?

我正在使用扩展事件为 SQL Server 设置监控系统,以便为我们的开发人员查找大量查询作为“生产反馈”。我正在使用事件sp_statement_completedsql_statement_completed,并在 cpu_time、逻辑读取等上使用谓词过滤器。我希望将结果汇总database_namequery_hash喜欢在互联网上的众多示例中展示的结果,但在结果中我看到query_hash所有语句都是 0使用 EXEC,如下表所示(为了便于阅读,缩短了时间戳和查询哈希)。

name                       timestamp      query_hash plan_handle        statement
sql_statement_completed    2016...6414    0          050056019600764... exec Shared.dbo.SyncFirm  
sql_statement_completed    2016...9946    0          06003d00e01e730... exec spSetUserAuth @userid;  
sql_statement_completed    2016...7184    0          0600e30028c9da0... exec spSetUserAuth @userid;  
sp_statement_completed     2016...0409    9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable
sp_statement_completed     2016...1448    8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns)  EXEC(@sql)
sql_statement_completed    2016...7752    0          0600f9006c23f03... exec spSetUserAuth @userid;  
sql_statement_completed    2016...1443    1304...641 06005a0008a9b11... select SUBQ.ontrackstatus, COUNT(SUBQ.ontrac
Run Code Online (Sandbox Code Playgroud)

所有结果都有其价值,plan_handle而且它们都不同,因此正在制定很多计划。其他没有query_hash(我见过的)语句包括 ALTER …

sql-server extended-events sql-server-2014

8
推荐指数
1
解决办法
490
查看次数

数据库级锁

我有一个 SQL Server 2014 的生产实例,我需要对其进行一些轻度维护。

本质上,我需要在单个事务中替换两个整个表的内容。我想防止任何人在数据更改正在进行时查询任一表。桌子很小,我希望操作不到几秒钟。

不幸的是,我没有为此安排停机时间的好处。

所以问题是如何一次锁定多个对象 - 甚至整个数据库?

理想情况下,我可以简单地获取数据库级锁,进行更改,然后释放锁,但这在 SQL Server 2014 中似乎是不可能的。

sql-server locking sql-server-2014

8
推荐指数
2
解决办法
6043
查看次数