Questions tagged «sql-server»

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

1
在单个数据库上批量插入权限
我在一家拥有直接IT安全方式的公司工作。为了优化我们团队中的某些流程,我被聘为数据库分析师。问题是我只具有读写权限,并且正在尝试获取数据库的高级权限。当前,我们在单个服务器上有很多数据库,并且只能在单个数据库上工作,我想知道是否BULK INSERT可以将权限授予单个数据库,还是对整个服务器授予权限? 我已经在网上搜索了一下,但是有些困惑。这是我发现的。为了使用BULK INSERT,我应该INSERT对所需的表或数据库具有权限,而ADMINISTER BULK OPERATIONS这是服务器范围的权限。如果我获得了ADMINISTER BULK OPERATIONS对整个数据库的INSERT许可权,并且获得了对单个数据库的许可权,那么BULK INSERT由于我没有INSERT对其他数据库的许可权,我是否只能在该单个数据库中? 是否可以将它限制为BULK INSERT在具有多个数据库的服务器上的单个数据库使用? 抱歉,文字墙,谢谢!

2
SQL Server十进制(9,0)与INT
我们的一位客户使用DECIMAL(18,0)他的SQL Server 2008R2数据库中的数据类型作为某些列。由于列的增长非常缓慢,因此他最近提议更改数据类型DECIMAL(5,0)以重新获得一些存储空间。 根据MSDN库,与DECIMAL(5,0)数据类型一样,DECIMAL(9,0)数据类型的存储空间为5个字节。INT是小1个字节,但可以存储-2 ^ 31到2 ^ 31范围内的所有内容,而不是DECIMAL(5,0)可以存储的-99,999到99,999 。即使是最大的DECIMAL5个字节(DECIMAL(9,0)),也只能存储-999,999,999到999,999,999(小于范围的一半)范围内的整数INT 4字节)。 我可以想到使用DECIMALover 的两个“好处” INT: 之后可以增加规模,而无需使用更多的存储空间 可以将精度扩展到38位,而无需更改数据类型 但是我认为这些并不是真正的好处: 将比例添加到整数仅在极少数情况下才有意义(在大多数情况下比例确实有所不同,也可以预先添加) SQL Server将每个精度/小数位组合视为不同的数据类型,因此在提高精度或小数位时,不会单独保留数据类型。 这让我想知道:DECIMAL(5,0)整数数据类型的附加好处是什么?

1
解释SQL Server的Showplan XML
我刚刚在网站http://sqlfiddle.com上推出了一项功能,该功能使用户可以查看其查询的原始执行计划。对于PostgreSQL,MySQL和(在某种程度上)Oracle,可以理解原始执行计划的输出。但是,如果您查看SQL Server的执行计划输出(使用生成的SET SHOWPLAN_XML ON),那么即使对于相对简单的查询,也要经过大量的XML。这是一个示例(摘自该“小提琴”的上一个查询的执行计划:http : //sqlfiddle.com/#!3/ 1fa93/1): <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0"> <BatchSequence> <Batch> <Statements> <StmtSimple StatementText="
select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96"> <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/> <QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72"> <RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="3" EstimateIO="0.003125" …

6
存储过程的突然执行计划
我试图了解SQL Server 2000所遇到的问题。我们是一个中等交易量的网站,我们有一个存储的proc调用sp_GetCurrentTransactions,它接受一个customerID和两个日期。 现在,根据日期和客户,此查询可以返回从零到1000s的行。 问题是:我们经历过的是,突然之间Execution Timeout Expired,当特定客户端尝试执行该存储的proc时,我们将获得许多错误(通常是类似错误)。因此,我们检查了查询,在SSMS中运行该查询,发现它花费了30秒。因此,我们重新编译存储的proc,然后-bang-它现在可以在300ms内运行。 我已经与我们的DBA谈过此事。他告诉我,当我们创建存储的proc时,数据库创建了一个查询计划。他说这对那组参数来说是一个很好的计划,但是如果您向它扔一些参数,那么该计划将不是该数据的最佳计划,因此您会发现它运行缓慢。 呈现给我的选项是将问题查询从存储的proc转移回动态SQL,该SQL具有每次运行时创建的执行计划。 这感觉就像是退后了一步,我觉得必须有一种解决方法。还有其他方法可以解决此问题吗? 任何和所有答复表示赞赏。


5
主文件组已满SQL Server 2008
我有一个大表(约5000万行),我正在尝试将其批量插入SQL Server,但出现错误: 无法为数据库“ I 3 Stroke”中的对象“ myDB”分配空间,因为“ PRIMARY”文件组已满。通过删除不需要的文件,在文件组中删除对象,向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。 数据库中还有另一个表,其中包含约2500万行。该数据库将仅在单台计算机上使用,并且将被设计用于挖掘已经存在的数据,并且在任何情况下都不会超过其当前大小。 对于这种情况,SQL Server不会抱怨的最佳解决方法是什么?解决方案是否关系到该数据库不会暴露给多个用户是否重要?

3
如何获取同一表上不同列的计数
表#01 Status: StatusID Status ----------------------- 1 Opened 2 Closed 3 ReOpened 4 Pending 表#02 Claims: ClaimID CompanyName StatusID -------------------------------------- 1 ABC 1 2 ABC 1 3 ABC 2 4 ABC 4 5 XYZ 1 6 XYZ 1 预期结果: CompanyName TotalOpenClaims TotalClosedClaims TotalReOpenedClaims TotalPendingClaims -------------------------------------------------------------------------------- ABC 2 1 0 1 XYZ …
15 sql-server  pivot 

5
在手写代码中使用SQL Server的括号表示法有意义吗?
当代码生成器使用[]几乎所有内容的新Microsoft括号符号()生成输出时,它们通常会更简单。 当我第一次看到它时,我虽然赞叹了一些被禁止的引用标识符符号的转世。 据我所知,它是Microsoft的专有扩展(意味着Oracle不支持它)。 查看SQL Server,如果您定义如下表,则没有区别 CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); 要么 CREATE TABLE dbo.Table_2 (col1 int, col2 int); 这是个人或公司风格的问题。始终如一。 现在,如果您要将数据库迁移到Oracle,则没有选择。 您可以使用旧的带引号的标识符,但是它们区分大小写,这会造成很多麻烦。 从生成的代码中删除所有括号,避免使用空格,其他特殊字符和名称的保留关键字以及仅以大多数DBMS能够理解的方式进行编码,这是一个好主意吗?

1
在SQL Server中本地解码Base64字符串
我varchar在SQL Server的表中有一列,其中包含一个base64编码的文本字符串,我想将其解码为等效的纯文本 SQL Server是否有任何本机功能来处理此类事件? 一个示例base64字符串: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== 解码为: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

4
如何从联接中选择第一行,该联接在主键上返回多个行
这与以下问题有关: 连接多个表导致重复的行 我有两个要加入的表。他们共享密钥。人员表的每个主键只有一个名称,但是电子邮件表的每个personId都有多个电子邮件。我只想显示每人的第一封电子邮件。目前我每人多行,因为他们有多封电子邮件。我正在运行SQL Server 2005。 编辑:这是T-SQL。第一封电子邮件实际上是每人的第一封电子邮件行。 编辑2:我看到的第一封电子邮件将是SQL在查询过程中在连接中显示的第一封电子邮件行。没关系显示哪个电子邮件。只显示不超过一封电子邮件。我希望这一点更加清楚。 Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;

6
更改sa密码
我正在尝试使用SQL Server Management Studio 2012更改sa帐户的密码。我已按照以下步骤操作,但是密码仍然相同。 登录到SQL Server Management Studio,选择数据库引擎,\ SBSmonitoring,Windows身份验证。 转到对象资源管理器-安全文件夹-登录文件夹。 右键单击SA帐户,然后选择“属性”选项。 在“常规页面”中,更改SA密码并确认。 在状态页中,将登录更改为已启用。单击确定以保存更改。 重新启动SQL Server及其所有服务。 任何想法 ?
15 sql-server 


1
是否有一种优雅的方式将查询结果直接发送到物理打印机?
我收到了这个奇怪的请求,要求安排报告并打印到打印机。 该报告本身非常简单,可以放在单个页面上。我可以将其打印为txt,这样就可以了(尽管我愿意接受有关更好产品的建议)。 这是代码。有用。但是我不喜欢。具体来说,我想取消嵌套的@bcp和@SQL。 问题:是否有更优雅的方法可以做到这一点? declare @filepath varchar(255), @filename varchar(255), @filetype varchar(255), @sql nvarchar(max), @coverpage_text nvarchar(max) set @filepath = 'C:\users\jmay\documents\' SET @filename = 'TestFile' set @filetype = '.txt' --output to txt set @sql = N'declare @bcp varchar(4000) set @bcp = ''bcp " select * from test_data " queryout ' + @filepath …
14 sql-server 

4
RAID0代替RAID1或5,这很疯狂吗?
我正在考虑为我们的一个SQL Server群集使用RAID0设置。我将概述情况,并在寻找为什么这可能不是一个好主意。同样,如果您有用例,白皮书或其他文档的人,您可以在这个主题上向我指出,那就太好了。 我们在2个数据中心中有3台服务器,它们是SQL群集的一部分。它们都在可用性组中运行SQL Server。主数据库旁边有一个副本,另一个数据库中有另一个副本。他们正在运行具有自动故障转移功能的同步复制。所有驱动器均为企业级SSD。他们将运行SQL Server 2017或2019。 我认为与其他方法相比,在RAID0阵列上运行它们会带来多种好处,并且几乎没有真正的缺点。我目前看到的唯一负面消息是主服务器上缺乏冗余,因此失败率增加了。作为专家: 如果驱动器发生故障,而不是一直运行到慢速,降级的状态,直到有人收到手动操作的通知,服务器将立即失败,导致辅助服务器保持完整的操作能力。通知我们有关故障转移的更多好处,因此我们可以更快地调查原因。 它减少了每TB容量整体发生故障的机会。由于不需要奇偶校验或镜像驱动器,因此减少了每个阵列的驱动器数量。使用更少的驱动器,发生驱动器故障的机会就更少了。 这更便宜。需要更少的驱动器以达到我们所需的容量显然会降低成本。 我知道这不是传统的商业思想,但是我有没有在考虑什么呢?我会喜欢任何赞成或反对的意见。 我并不想这样做,以提高查询性能,但是如果有有意义的建议,请随时指出。我最关心的是无法考虑或解决我从未想到的可靠性或冗余性问题。 操作系统位于单独的镜像驱动器上,因此服务器本身应处于启动状态。这些驱动器之一可以更换并再次镜像。它很小,除了系统DB之外没有任何数据库文件。我无法想象这需要花费几分钟的时间。如果其中一个数据阵列发生故障,我们将更换驱动器,重建阵列,还原并与AG重新同步。以我个人的经验,恢复比RAID5驱动器重建快得多。我从来没有遇到过RAID1故障,所以我不知道该重建是否会更快。还原将来自备份,并前滚以匹配主数据库,因此,仅将最后几分钟的日志与恢复的副本同步,主服务器上的负载增加应该非常小。

1
直方图以外的基数估计
设定 我在了解基数估算值时遇到了一些麻烦。这是我的测试设置: 2010版本的Stack Overflow数据库 SQL Server 2017 CU15 + GDR(KB4505225)-14.0.3192.2 新CE(兼容级别140) 我有这个过程: USE StackOverflow2010; GO CREATE OR ALTER PROCEDURE #sp_PostsByCommentCount @CommentCount int AS BEGIN SELECT * FROM dbo.Posts p WHERE p.CommentCount = @CommentCount OPTION (RECOMPILE); END; GO dbo.Posts表上没有非聚集索引或统计信息(上有聚集索引Id)。 当要求为此的估计计划时,出来的“估计行” dbo.Posts为1,934.99: EXEC #sp_PostsByCommentCount @CommentCount = 51; 当我要求估算的计划时,会自动创建以下统计信息对象: DBCC SHOW_STATISTICS('dbo.Posts', [_WA_Sys_00000006_0519C6AF]); 其中的重点是: …

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.