Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
在功能/存储过程创建时禁用架构检查
我正在尝试自动化对SQL Server 2008 R2数据库执行更改的过程。我放置的过程会删除并重新创建我的存储过程和函数,以及运行脚本来更改表/列/数据。不幸的是,其中一个脚本需要首先放置其中一个功能。但是我不能先运行所有存储的proc / function更改,因为它首先依赖于从表/列/数据更改脚本中添加的列。 我想知道是否可以在不通过SQL Server验证函数/ SP定义中使用的列的情况下运行存储过程和函数?我尝试查找,但找不到条件或命令来启用此功能。

2
两个会话可以创建具有相同名称的#temp表吗?
我正在创建一个临时表(#myTable)并使用一个游标。当并发用户通过我的应用程序访问游标时,这是否会产生问题?它可以让我创建具有相同名称的单独的临时表吗? 以下是示例代码: Open cursor; Fetch Next from cursor into @Variable_Temp_Table_Name; Create table #myTable(pk int) While @@Fetch_Status = 0 Begin Fetch Next from cursor into @Variable_Temp_Table_Name; End

1
操作员在执行溢出级别2的过程中使用tempdb溢出数据
我正在努力通过警告Operator usedtempdb 将查询计划上的排序操作的成本降至最低to spill data during execution with spill level 2 我发现有几个与泄漏级别为1的执行过程中的泄漏数据有关的帖子,但与级别2无关,而级别1似乎是由于过时的统计信息引起的,级别2呢?我找不到与关联的任何内容level 2。 我发现本文与排序警告有关非常有趣: 永不忽略SQL Server中的排序警告 我的SQL Server? Microsoft SQL Server 2014(SP2)(KB3171021)-12.0.5000.0(X64)2016年6月17日19:14:09版权所有(c)Windows NT 6.3(Build 9600:)上的Microsoft Corporation Enterprise Edition(64位)(系统管理程序) 我的硬件? 运行下面的查询以查找硬件: -来自SQL Server 2012的硬件信息 SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS [Hyperthread Ratio], cpu_count/hyperthread_ratio AS [Physical CPU Count], physical_memory_kb/1024 AS …


3
为什么查询的解析方式不允许大多数子句中使用列别名?
在尝试编写查询时,我发现(困难的方式)SQL Server在执行查询时在解析SELECT之前很久就解析了查询中的WHERE。 的MSDN文档说,一般逻辑解析顺序是这样的:SELECT被解析几乎最后(因此导致“没有这样的对象[别名]”试图使用在其他条款列别名时误差)。甚至有人建议允许在任何地方使用别名,这被Microsoft团队否决,理由是ANSI标准合规性问题(这表明此行为是ANSI标准的一部分)。 作为程序员(不是DBA),我发现这种行为有些令人困惑,因为在我看来,它在很大程度上违反了使用列别名的目的(或者至少可以使列别名的功能更加强大)。在查询执行的较早阶段进行了解析),因为您真正可以使用别名的唯一位置是ORDER BY。作为程序员,似乎缺少使查询变得更强大,更便捷和更干燥的巨大机会。 看起来这是一个显而易见的问题,因此,还有其他原因决定除SELECT和ORDER BY之外的任何内容都不应使用列别名,但是这些原因是什么?
16 sql-server  alias 

2
当SQL Server没有可用的物理内存时会发生什么?
在进行谷歌搜索时,我发现了一些相互矛盾的信息。 一些站点指出,当没有物理内存可用于数据时,SQL Server会将已存在的数据移至TEMPDB中(请参阅:SQL Server:使TempDb神秘化和建议)。 但是其他站点指出,当剩余的物理内存不足时,操作系统可以使用PAGE FILE并将数据从物理内存移至该页面(请参阅SQL Server的页面文件)。 我想知道当SQL Server的物理内存用尽时,它将在哪里写入数据?要tempdb还是OS页面文件?还是两者都可以?

2
使用的列大小比必要的大得多
我正在与其他人创建SQL Server数据库。其中一张表很小(6行),数据可能保持不变。极有可能会添加新行。该表如下所示: CREATE TABLE someTable ( id int primary key identity(1,1) not null, name varchar(128) not null unique ); INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here'); 我正在查看该name列的char长度,并且我认为它的值可能永远不会大于,例如32个字符,甚至可能不大于24个字符。我将此列更改为,例如,varchar(32)? 另外,将默认列大小保持为4、8、32等的倍数是否有任何优势?

2
SQL语句是否可以在SQL Server的单个会话中并发执行?
我已经编写了一个使用临时表的存储过程。我知道在SQL Server中,临时表是会话作用域的。但是,我无法找到有关会话功能的确切信息。特别是,如果此存储过程有可能在单个会话中同时执行两次,则该过程中的事务需要更高的隔离级别,因为这两个执行现在共享一个临时表。

1
在RAW分区上创建数据库不再有效?
我正在尝试使用两个原始分区(即未格式化的分区)创建数据库。 Microsoft Docs声明您可以执行此操作,您只需要指定原始分区的驱动器号即可,如下所示: CREATE DATABASE DirectDevice ON (NAME = DirectDevice_system, FILENAME = 'S:') LOG ON (NAME = DirectDevice_log, FILENAME = 'T:') 但是,SQL Server 2017返回此错误: 消息5170,级别16,状态4,第1行 无法创建文件'S:',因为它已经存在。更改文件路径或文件名,然后重试该操作。 消息1802,级别16,状态4,第1行 CREATE DATABASE失败。列出的某些文件名无法创建。检查相关错误。 文档的相关部分指出: 如果文件位于原始分区上,则os_file_name必须仅指定现有原始分区的驱动器号。每个原始分区上只能创建一个数据文件。 是的,驱动器S:和T:都是我系统中确实存在的未格式化原始分区: DISKPART>详细分区 分区4 类型:ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 隐藏:否 必填:否 属性:0000000000000000 字节偏移量:999934656512 卷### Ltr标签Fs类型尺寸状态信息 ---------- --- -------------- ----- ---------- ------- ---- ----- -------- …

1
为什么CHECKDB读取具有内存优化表的数据库上的事务日志文件?
tl; dr:为什么CHECKDB读取具有内存优化表的用户数据库的事务日志? 似乎CHECKDB在检查我的一个数据库-特别是使用内存中OLTP表的数据库时,正在读取用户数据库的事务日志文件。 该数据库的CHECKDB仍会在相当长的时间内完成,因此我主要是对行为感到好奇。但绝对是此实例上所有数据库中CHECKDB的最长持续时间。 从Paul Randal的史诗《从各个角度看CHECKDB:完整描述所有CHECKDB阶段》中,我看到SQL 2005以前的CHECKDB 用于读取日志,以便获得数据库的一致视图。但是由于这是2016年,因此它使用内部数据库快照。 但是,快照的先决条件之一是: 源数据库不得包含MEMORY_OPTIMIZED_DATA文件组 我的用户数据库具有这些文件组之一,因此看起来快照不在桌面上。 根据CHECKDB文档: 如果无法创建快照,或者指定了TABLOCK,则DBCC CHECKDB将获取锁以获取所需的一致性。在这种情况下,需要排他数据库锁来执行分配检查,并且需要共享表锁来执行表检查。 好的,所以我们正在执行数据库和表锁定而不是快照锁定。但这仍然不能解释为什么它必须读取事务日志。那有什么呢? 我在下面提供了一个脚本来重现该场景。它用于sys.dm_io_virtual_file_stats标识日志文件读取。 请注意,大多数情况下,它读取日志的一小部分(480 KB),但偶尔读取的日志则更多(48.2 MB)。在我的生产场景中,当我们运行CHECKDB时,它每天晚上在午夜读取大多数日志文件(约占2 GB文件的1.3 GB)。 这是到目前为止我通过脚本获得的输出示例: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:12:29.203 106 50545664 或这个: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:25:14.227 1 491520 如果我用常规表替换内存优化的对象,则输出如下所示: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:21:03.207 0 0 为什么CHECKDB读取日志文件?尤其是为什么它偶尔会读取日志文件的很大一部分? 这是实际的脚本: -- let's have …

1
如何在SQL Server盒上扩展卷?
这是针对系统操作员(或那些曾经经历过此经验的人)的问题。 我公司想在生产中的现有SQL Server盒上分配额外的磁盘空间。我们想知道是否可以联机完成扩展卷(在磁盘管理中为“扩展卷...”),还是需要关闭SQL Server服务。 为何应停止SQL Server Service来执行此操作,还是在白天只执行此操作可以吗? 以防万一系统规格相关。这是运行Windows 2012 R2和SQL Server 2008 R2的真实设备(无虚拟化)。 谢谢!

5
由于WHERE子句中的条目超过100,000个,导致SQL Server错误8632
我的问题(或至少是错误消息)与查询处理器用尽内部资源非常相似-极长的sql查询。 我的客户正在使用SQL选择查询,其中包含一个正好有100,000个条目的子句。 查询失败,出现错误8632和错误消息 内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,然后尝试简化它们。) 我非常奇怪地抛出此错误消息,恰好在100,000个条目处,所以我想知道这是否是可配置的值。是这种情况,如果是的话,如何将该值增加到更高的值? 在MSDN上,建议重新编写查询,但我想避免这种情况。 同时,我发现我正在谈论的条目列表包含自然数,其中有些看起来似乎是连续的(例如(1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20)。 这使得SQL的子句类似于: where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20) 我可以将其转换为: where (entry between 1 and 3) OR (entry between 6 and 10) OR (entry between 12 and 13) OR (entry between 15 and 20) 可以通过以下方式将其缩短: where entry in (1,...,3,6,...,10,12,13,15,...,20) ...或类似的东西?(我知道这是一个长期的尝试,但这会使软件更新更容易且更具可读性) 供您参考:where子句中的数据是在另一个表上完成的计算结果:首先在该表的开头读取并过滤该表的条目,然后再进行一些额外的处理(使用SQL),这种额外处理的结果是更多的过滤,其结果在where子句中使用。由于不可能用SQL编写完整的过滤,因此使用了上述方法。显然,子句的内容可能在每个处理过程中都发生变化,因此需要动态解决方案。

3
在IF EXISTS中包装查询会使它非常慢
我有以下查询: select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) 上面的查询将在三秒钟内完成。 如果上面的查询返回任何值,我们希望存储过程为EXIT,因此我将其重写如下: If Exists( select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) ) Begin Raiserror('Source missing',16,1) Return …

2
SQL Server用与定义不匹配的数据填充PERSISTED列是否合法?
我正在跟踪有关计算列中的奇怪值的问题PERSISTED。那里的答案使人对这种行为的产生方式有一些猜测。 我在问以下问题:这不是一个彻底的错误吗?是否PERSISTED允许列以这种方式运行? DECLARE @test TABLE ( Col1 INT, Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1 INSERT INTO @test (Col1) VALUES (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)) SELECT * FROM @test --shows impossible …

2
递归CTE为所有子代查找总计
这是我要使用递归T-SQL查询(大概是CTE)与以下预期结果进行搜索的程序集树。我想知道给定零件的每个组件的总数。 这意味着如果我搜索“铆钉”,我想知道装配体中每个级别的总数量,而不仅仅是直接子数量。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 目前,我可以得到直系父母,但想知道如何扩展我的CTE,以使我可以将此信息向上滚动。 With …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.