Questions tagged «sql-server-2017»

SQL Server 2017(主要版本14.00.xxxx)。还请标记sql-server。

1
bcp命令'。'附近的语法不正确。字符实际上是:“ä”
我 在Ubuntu(Linux)上安装了mssql-server和mssql-tools。当我尝试使用bcp命令使用以下命令行导出数据时: bcp DBname.dbo.Täble_Name out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ 我收到此错误: SQLState = 37000,NativeError = 102 错误= [Microsoft] [用于SQL Server的ODBC驱动程序13] [SQL Server]'。'附近的语法不正确。 该�是ä。 如果我Täble_Name用方括号括起来: bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ 我在对象名称上收到此错误: SQLState = S0002,NativeError = 208 错误= [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]无效的对象名'DBname.dbo.Täble_Name'。 …

2
无法在Ubuntu 16.04上启动SQL Server
我在Ubuntu 16.04计算机上安装了SQL Server v.Next公开预览版,并且昨天可以正常工作。但这今天不起作用。 出现以下错误: root @ OraServer:/ var / opt / mssql / log#systemctl状态mssql-server ●mssql-server.service-Microsoft(R)SQL Server(R)数据库引擎 已加载:已加载(/lib/systemd/system/mssql-server.service;已启用;供应商预设:已启用) 活动:自Sun 2016-11-27 13:34:23 IST起处于活动状态(无效)(结果:退出代码);18s前 进程:6368 ExecStart = / opt / mssql / bin / sqlservr(代码=已退出,状态= 1 /失败) 主PID:6368(代码=已退出,状态= 1 /失败) 11月27日13:34:23 OraServer systemd [1]:mssql-server.service:设备进入失败状态。 11月27日13:34:23 OraServer systemd [1]:mssql-server.service:失败,结果为“退出代码”。 11月27日13:34:23 OraServer systemd [1]:mssql-server.service:服务延期超时,计划重新启动。 …

2
防止SSMS查看服务器的文件系统
我有几个用户在我的管理下共享MS SQL Server 2017。他们不应该看到(甚至不知道)该服务器上的其他用户及其数据。每个用户都有自己的数据库。他们可以使用他们的数据库做任何想要的事情。 我正在使用SQL Server的Partial Containment功能将用户锁定在适当的位置。登录名是在数据库内部创建的。这样效果很好,因为他们看不到其他用户帐户或数据库。将数据库登录名添加到我使用以下命令创建的数据库角色中: USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole 我刚刚创建了一个数据库登录帐户,仅将其添加到上述角色。用户没有其他权限(据我所知)。 剩下的唯一问题是SSMS仍然能够浏览服务器的文件系统。如果我右键单击数据库并选择Tasks -> Restore -> Database,然后选择Device: -> [...]并添加文件。这使SSMS可以浏览服务器的文件系统,我想否认这一点。用户实际上不能还原数据库,但可以浏览文件系统。 这里的问题表明SSMS正在使用存储过程xp_fixeddrives,xp_dirtree并且xp_fileexist。但是,这些存储过程在具有所述组许可的用户身份执行时返回空结果。我已经读到,这是用户不是sysadmin角色成员时的行为。这已经使我有些困惑,因为我明确拒绝了执行该命令,但是用户仍然可以执行存储过程。但是,当通过SSMS浏览文件系统时,它不是空的。 SSMS从哪里获取文件系统信息,如何防止这种情况发生? 编辑:我也刚刚注意到,SSMS能够检索所有数据库在服务器上存在的所有数据库备份的列表。再说一次,我不知道它如何获得这些信息以及如何防止它。

1
在JOIN子句中使用OR时奇怪的查询计划-持续扫描表中的每一行
我正在尝试生成一个示例查询计划,以说明为什么对两个结果集进行UNIONing可能比在JOIN子句中使用OR更好。我写的查询计划让我感到困惑。我将StackOverflow数据库与Users.Reputation上的非聚集索引一起使用。 查询是 CREATE NONCLUSTERED INDEX IX_NC_REPUTATION ON dbo.USERS(Reputation) SELECT DISTINCT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId OR Users.Id = Posts.LastEditorUserId WHERE Users.Reputation = 5 查询计划位于https://www.brentozar.com/pastetheplan/?id=BkpZU1MZE,对我来说查询时间为4:37分钟,返回了26612行。 我以前从未见过从现有表中创建过这种恒定扫描的样式-我不熟悉为什么在用户输入的单行通常使用恒定扫描的情况下,每行都要进行恒定扫描的原因例如SELECT GETDATE()。为什么在这里使用它?在阅读此查询计划时,我将非常感谢一些指导。 如果我将该OR拆分为一个UNION,它将生成一个标准计划,该计划在12秒内运行,并返回相同的26612行。 SELECT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId WHERE Users.Reputation = 5 UNION SELECT Users.Id …

2
为什么这样更快并且使用安全吗?(第一个字母在字母表中)
长话短说,我们正在用很小的人表中的值更新小的人表。在最近的测试中,此更新大约需要5分钟才能运行。 我们偶然发现了似乎最简单的优化方法,该方法似乎完美无缺!现在,同一查询可以在不到2分钟的时间内运行,并且可以完美地产生相同的结果。 这是查询。最后一行添加为“优化”。为什么查询时间急剧减少?我们错过了什么吗?这会在将来引发问题吗? UPDATE smallTbl SET smallTbl.importantValue = largeTbl.importantValue FROM smallTableOfPeople smallTbl JOIN largeTableOfPeople largeTbl ON largeTbl.birth_date = smallTbl.birthDate AND DIFFERENCE(TRIM(smallTbl.last_name),TRIM(largeTbl.last_name)) = 4 AND DIFFERENCE(TRIM(smallTbl.first_name),TRIM(largeTbl.first_name)) = 4 WHERE smallTbl.importantValue IS NULL -- The following line is "the optimization" AND LEFT(TRIM(largeTbl.last_name), 1) IN ('a','à','á','b','c','d','e','è','é','f','g','h','i','j','k','l','m','n','o','ô','ö','p','q','r','s','t','u','ü','v','w','x','y','z','æ','ä','ø','å') 技术说明:我们知道要测试的字母列表可能还需要几个字母。我们还意识到使用“ DIFFERENCE”时明显的错误余量。 查询计划(常规): https : //www.brentozar.com/pastetheplan/? id …

1
稀疏列,CPU时间和过滤索引
稀疏 当像您一样对稀疏列进行一些测试时,我想知道造成性能下降的直接原因。 DDL 我创建了两个相同的表,一个表具有4个稀疏列,而一个表没有稀疏列。 --Non Sparse columns table & NC index CREATE TABLE dbo.nonsparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, charval char(20) NULL, varcharval varchar(20) NULL, intval int NULL, bigintval bigint NULL ); CREATE INDEX IX_Nonsparse_intval_varcharval ON dbo.nonsparse(intval,varcharval) INCLUDE(bigintval,charval); -- sparse columns table & NC index CREATE TABLE dbo.sparse( …

1
为什么MS SQL Server SEQUENCEs没有像Oracle这样的ORDER参数?
在T-SQL 的文档中CREATE SEQUENCE,您可以看到该CREATE SEQUENCE命令没有ORDER参数。 为了进行比较,用于CREATE SEQUENCE显示ORDER/ NOORDER选项的Oracle文档: ORDER 指定ORDER以确保按请求顺序生成序列号。如果将序列号用作时间戳,则此子句很有用。对于用于生成主键的序列,保证顺序通常并不重要。 ORDER仅在将Oracle数据库与Real Application Clusters一起使用时才有必要保证有序生成。如果使用独占模式,则序列号始终按顺序生成。 NOORDER 指定NOORDER是否不想保证按请求顺序生成序列号。这是默认值。 Microsoft SQL Server是否为SEQUENCEs 提供强大的排序约束?还是Microsoft总体上认为它不重要?

3
为什么此查询缺少FROM子句而不出错?
因此,我们有一个带有带有错字的子查询的查询。它缺少FROM子句。但是,当您运行它时,它不会出错!为什么!? SELECT 1 ,r.id ,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56' ,GETDATE() ,1 ,'Y' ,'N' ,oldItem.can_view ,oldItem.can_update FROM Role r JOIN RoleObject oldReport ON r.customer_id = oldReport.customer_id JOIN RoleItem oldItem ON oldReport.id = oldItem.role_object_id AND r.id = oldItem.role_id WHERE r.id NOT IN (SELECT role_id WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56') AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'

3
在提交之前,SQL Server是否允许事务中的DDL(使其可见)到事务中?
在PostgreSQL中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到其他类型的新列,从而在上重写一个表COMMIT, CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); 其次是, BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; 但是,Microsoft SQL Server中的同一件事似乎会产生错误。比较此工作的db fiddle,其中ADD(column)命令在事务之外, -- txn1 BEGIN TRANSACTION; ALTER TABLE foo ADD b …


2
连接到本地主机时,SMO,SSMS对于在Docker中管理SQL Server的速度很慢
TL; DR:当通过可解析为IPv6环回(::1)的名称连接到我的SQL Server Docker容器时,SMO调用确实很慢。使用时127.0.0.1,速度很快。 我正在尝试学习如何使用Docker镜像microsoft / mssql-server-windows-developer。根据Microsoft的文档,此容器仅公开端口1433 TCP。 docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer 我正在Windows 10上运行该容器,并且已成功启动该容器,使用SQL Server身份验证进行身份验证,并在Windows主机上使用sqlcmd和SSMS 17.4对实例运行查询(连接到localhost或“。”),以及SQL操作通过IP连接的隔壁Mac上的Studio。这样运行查询时,我看不到任何明显的性能问题。 在SSMS中,我也可以浏览对象资源管理器,但是如果尝试从对象资源管理器中的对象的右键菜单上执行某些操作,例如打开实例参数窗口或附加数据库,则SSMS不会显示约5的响应-10分钟,此时它要么显示我要的窗口,要么显示以下错误消息: 我还尝试使用SMO Scripter对象针对此实例进行一些PowerShell脚本编写,并看到相同的行为。PS脚本循环遍历数据库中的对象并将其脚本化为文件,并且可以相对较快地收集对象列表,但是每个单独的对象需要5-10分钟的时间来编写脚本-太慢了,无法使用。 我有一个预感,即单个暴露的端口还不够,SMO和SSMS试图以类似的方式进行连接,这会使它们变慢。难道是当连接到本地主机时,这些工具是否假定存在其他通常不会进行防火墙保护的通信通道?我可以使用其他任何连接参数吗?谁能验证我关于SSMS正在使用SMO或其他与SQL Server通信的假设? 更新:我仍在调查,但这似乎是围绕资源限制的Docker问题。这很令人困惑,因为大多数文档似乎都表明Windows容器没有任何默认资源限制(并且不能在Docker for Windows GUI中设置这些默认资源限制- 仅对于Linux容器),但是实际上,Windows在Windows 10上运行的容器的默认RAM分配为1GB。我仍在尝试找出如何检查正在运行的容器以查看其RAM和CPU分配的方法,但是接下来我必须尝试使用docker run参数从默认值中增加这些值。 进一步更新:我一直无法从docker获得任何可靠的指标,该指标可以告诉我该容器对CPU和内存的限制。各种研究表明,docker容器默认没有内存限制,或者它们有1GB,但是我目前只能验证的是,docker stats该SQL容器仅使用 750到850兆之间,何时我尝试添加一个运行参数来将可用内存设置为4 GB,但出现错误。因此,我不再关注该查询线程,而是进行了另一项肠道检查:在正在运行的容器上进入交互式Powershell会话,然后从容器内部调用上面链接的Powershell脚本。 在容器内运行没有问题。它在短短几分钟内就烧穿了2780个物体。我认为这可以确认问题出在容器/主机边界上,因此我将看看是否可以打开该UDP端口。更新:打开端口1434 UDP没有帮助。 更多更新-已解决,而不是资源约束问题:似乎与为Windows容器设置大的内存分配有关的问题 -我在3g和2g上收到类似的错误,但最终能够从1.5g启动该容器,并且我发现docker stats容器的差异(我认为)证实了容器运行时的默认分配为1GB。在默认设置下,PRIV WORKING SET stat(我找不到任何文档,但我最大的猜测是它的RAM)在700MiB和850MiB之间。用docker run —memory="1.5g"设置,大约是1.0GiB。因此,它的确扩大了,但似乎腾出了比以前更多的分配空间。我将此解释(可能是错误地)是指该服务器(绝对没有负载运行并且没有用户数据库)没有内存压力。我检查了最大服务器内存设置,以确认它设置为默认的最大2PiB。 …


1
“警告:操作导致残留的I / O”与关键查找
我在SQL Server 2017执行计划中看到了以下警告: 警告:操作导致剩余IO [sic]。实际读取的行数为(3,321,318),但返回的行数为40。 这是SQLSentry PlanExplorer的片段: 为了改进代码,我添加了非聚集索引,因此SQL Server可以访问相关行。它工作正常,但通常索引中将包含太多(大)列。看起来像这样: 如果我仅添加索引,而没有包含列,则强制使用索引,如下所示: 显然,SQL Server认为密钥查找比剩余的I / O昂贵得多。我有一个没有大量测试数据的测试设置(但是),但是当代码投入生产时,它需要处理更多的数据,所以我很确定需要某种非聚集索引。 当您在SSD上运行时,关键查询真的那么昂贵吗?我必须创建全脂索引(包含很多包含列)吗? 执行计划: https : //www.brentozar.com/pastetheplan/?id=SJtiRte2X这是一个长存储过程的一部分。寻找IX_BatchNo_DeviceNo_CreatedUTC。

1
在SQL Server 2017和Azure SQL DB中查找默认隔离级别
我正在读一本与交易和并发有关的书。在一个段落中提到: 在本地SQL Server实例中,默认隔离级别是基于锁定的已读提交 接下来的句子是: SQL数据库中的默认值为读取-基于行版本的已提交快照 我的问题是:这两个句子中的“本地SQL Server实例”和“ SQL数据库”之间有什么区别? 什么是默认隔离级别,如何找到它?是否有任何特殊查询来查找默认隔离级别?

1
DBCC CheckDB之后,性能监视器中的数据库缓存内存显着下降
我们一直在监视一些SQLServer: Memory Manager指标,并注意到DBCC CheckDB工作后指标 Database Cache Memory (KB) 下降明显。确切地说,它从140 GB缓存的DB内存降至60 GB。之后,请在一周内慢慢增加速度。(“ Free Memory KB”的数量从之后的20 GB变为100 GB CheckDB) DBCC CheckDB 在每个星期日运行,因此数据库高速缓存内存必须每周再次增加 What is the behavior of this ? Why CheckDB pushes database pages out of memory ? 第二个问题是为什么“ buffer cache hit ratio” DBCC CheckDB完成后没有变化? 它平均为99.99%,而在DBCC CheckDB工作后下降至〜98.00%,并很快恢复至99%,而我预计buffer cache hit ratio会大幅下降,因为数据库数据必须再次从存储读取到RAM?

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.