Questions tagged «sql-server»

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

2
每个SQL实例的SPN条目应该是什么样的?
我在寻找相互矛盾的信息,以了解如何精确格式化SPN(服务主体名称)以获取正确的Kerberos连接,以及每个SQL实例需要多少连接。 该2017 MS文档包含以下内容: 从SQL Server 2008开始,为了支持TCP / IP,命名管道和共享内存上的Kerberos身份验证,更改了SPN格式。命名实例和默认实例支持的SPN格式如下。 命名实例: MSSQLSvc/FQDN:[port|instancename] 默认实例: MSSQLSvc/FQDN:port|MSSQLSvc/FQDN 新的SPN格式不需要端口号。这意味着不使用端口号的多端口服务器或协议可以使用Kerberos身份验证。 我以最后一段表示我只需要一个条目,即以下一项: 命名实例: MSSQLSvc/sqlbox1.mydomain.org/instance2 默认实例: MSSQLSvc/sqlbox1.mydomain.org 这似乎与该较旧的(2011)MS文档矛盾,不仅与端口号有关,而且与使用的名称有关: 若要创建SPN,可以使用SQL Server的Ne​​tBIOS名称或完全限定域名(FQDN)。但是,您必须为NetBIOS名称和FQDN创建一个SPN。 当我查看环境中已经存在的SPN时,会看到各种各样的组合,某些服务器最多包含4个条目: MSSQLSvc/sqlbox1 MSSQLSvc/sqlbox1:1433 MSSQLSvc/sqlbox1.mydomain.org MSSQLSvc/sqlbox1.mydomain.org:1433 甚至MS自己的Kerberos配置管理器似乎都希望生成最后两个版本(具有适当的混淆): 同样,对于现有的命名实例,我看到了一个奇怪的组合,其中一些几乎肯定是无效的: MSSQLSvc/sqlbox1:1522 MSSQLSvc/sqlbox1:instance2 MSSQLSvc/sqlbox1.mydomain.org:1522 MSSQLSvc/sqlbox1.mydomain.org:instance2 MSSQLSvc/sqlbox1.mydomain.org/instance2 MSSQLSvc/sqlbox1.mydomain.org:1522:instance2 因此,如果我仅在环境中使用TCP,那么对于默认实例和命名实例,DSN的实际外观如何? 我应该包括端口吗?还是在端口中包含一个,在端口中包含一个? 仅使用FQDN,还是仅需要Netbios名称的条目?还是仅当我们使用命名管道(不是)时? (对于上下文,我们运行SQL 2005到2014,其中一些是群集的,其他是独立的。连接仅通过TCP,在配置管理器中禁用了命名管道。我们将手动修复/创建这些管道,而不是允许SQL服务帐户在创建时服务器启动。)

2
如何找到两次之间的工作
是否有查询以检查在给定时间之间运行的作业。我可以检查两次之间安排的作业,但我不希望这样。 示例我想知道介于16:00:00和之间的作业17:00:00 在某些情况下,计划在的工作15:00:00可能会运行超过1个小时,我也希望这样做。我确实在google中搜索过,但所得到的只是两次安排的工作

2
SSMS和注册服务器结果
背景: 我们正在尝试为我们的一个支持团队创建AG“主要”测试工具。不知道在任何给定时间哪些服务器将是指示它们针对已注册服务器组执行TSQL的主要服务器。注册的服务器组由AG中的所有服务器组成。目标是仅在当前主服务器上执行TSQL: 当前测试线束: IF EXISTS (SELECT * FROM sys.dm_hadr_availability_replica_states AS HARS INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME)) BEGIN <<SOME CODE TO EXECUTE>> END 问题: 如果第一台响应多服务器查询的服务器未返回任何结果,则SSMS将假定正确的结果集为没有结果集,即使其他服务器随后返回了结果集也是如此。因此,在这种情况下,不会返回任何结果……这是不正确的,也不是预期的功能。 谁能想到使用SSMS(这是CS团队最熟悉的工具)强制在当前主服务器上执行的方法吗?

2
如何将Windows SID转换为SQL Server server_user_sid?
有一个不错的SQL Server函数SUSER_SNAME,可将server_user_sid转换为用户名。这对于将众所周知的Windows SID转换为(可能本地化的)用户名很有用。 例: SELECT SUSER_SNAME(0x01020000000000052000000021020000) -- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer') 通过一些Google搜索和反复试验(=手动创建用户,然后进行检查sys.server_principals),我确定了以下等效条件: Built-in User/Group Windows SID SQL Server server_user_sid BUILTIN\USERS S-1-5-32-545 0x01020000000000052000000021020000 NT AUTHORITY\SYSTEM S-1-5-18 0x010100000000000512000000 将Windows SID转换为SQL Server server_user_sids的算法是什么?

1
为什么GETUTCDATE早于SYSDATETIMEOFFSET?
另外,Microsoft如何使时间旅行成为可能? 考虑以下代码: DECLARE @Offset datetimeoffset = sysdatetimeoffset(); DECLARE @UTC datetime = getUTCdate(); DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0)); SELECT Offset = @Offset, UTC = @UTC, UTCFromOffset = @UTCFromOffset, TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END; @Offset设置在之前 @UTC,但有时值更高。(我已在SQL Server 2008 R2和SQL Server 2016上尝试过此操作。您必须运行几次以捕获可疑事件。) 这似乎不只是舍入或缺乏精度的问题。(实际上,我认为四舍五入是偶尔“解决”该问题的原因。)样本运行的值如下: 偏移量 2017-06-07 12:01:58.8801139 …

4
SSRS和托管服务帐户-无法配置?
我们正在尝试将Reporting Services配置为使用托管服务帐户。环境是: 服务器:Windows 2008 R2 SP1报告服务:SQL Server 2012(版本11.0.6567.0) 当前,SSRS作为域服务帐户运行,但是我们希望更改为作为MSA运行。SQL Server实例和代理都已成功更改为使用MSA。 当我尝试通过Reporting Services配置管理器将服务帐户更改为MSA时,收到错误消息: Microsoft.ReportingServices.WmiProvider.WMIProviderException:帐户名无效。以domain \ alias形式指定一个帐户。 ---> System.Runtime.InteropServices.COMException(0x8004021D):来自HRESULT的异常:0x8004021D-内部异常堆栈跟踪的结尾--- Microsoft.ReportingServices.WmiProvider.RSWmiAdmin.ThrowOnError(ManagementBaseObject mo)在Microsoft.ReportingServices .WmiProvider.RSWmiAdmin.SetWindowsServiceIdentity(String accountName,SecureString password,Boolean useBuiltinAccount)at ReportServicesConfigUI.WMIProvider.RSReportServerAdmin.SetWindowsServiceIdentity(String accountName,SecureString password,Boolean useBuiltinAccount) 我的问题很简单: 是否有人成功将SSRS服务帐户更改为使用托管服务帐户?如果是这样,怎么办?

1
执行计划显示缺少索引但查询很快
在查看实际的执行计划时,即使查询所用的时间少于1秒,它也会显示缺少的索引。 SELECT Account.AccountID, Account.Name FROM account LEFT OUTER JOIN accountfeaturesetting afs ON afs.accountid = account.accountid and afs.featureid = 'Schedules' and afs.settingid = 'EditReasons' WHERE ISNULL(afs.Value, '0') = '0' AND EXISTS (SELECT 1 FROM program WHERE program.AccountID = account.AccountID AND program.Active = 1 AND (program.ScheduleEditReasonFlags <> 0 OR program.ScheduleEditReasonFields <> 0)) …

3
如何在保留FK关系的同时将迁移数据复制到带有Identity列的新表中?
我想将数据从一个数据库迁移到另一个数据库。表模式完全相同: CREATE TABLE Customers( [Id] INT NOT NULL PRIMARY KEY IDENTITY, (some other columns ......) ); CREATE TABLE Orders( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [CustomerId] INT NOT NULL, (some other columns ......), CONSTRAINT [FK_Customers_Orders] FOREIGN KEY ([CustomerId]) REFERENCES [Customers]([Id]) ) 这两个数据库具有不同的数据,因此在两个数据库中,同一表的新标识密钥将有所不同。那不是问题;我的目标是将新数据添加到现有数据中,而不是完全替换整个表中的所有数据。但是,我想保留插入数据的所有父子关系。 如果我使用SSMS的“生成脚本”功能,则脚本将尝试使用相同的ID进行插入,这将与目标数据库中的现有数据发生冲突。如何仅使用数据库脚本复制数据? 我希望目标处的身份列从其上一个值正常继续。 Customers没有任何其他UNIQUE NOT NULL约束。它是确定在其他列重复数据(我使用的是Customers与Orders只是作为一个例子在这里,所以我没有解释整个故事)。问题是关于任何一对N关系。

2
在单独的数据库之间建立关系是不好的做法吗?
我正在与一个具有多个数据库的客户端一起工作。有多个master级别数据库,这些级别数据库具有从instance级别数据库(特定于应用程序的DB)返回的关系。从instance到的关系master是整数值,代表.NET中表的主键master。设置中的视图和存储过程以通过这些存储的键instances从中加载数据master。 显然,没有真正的参照完整性,但是这是一种不好的做法还是应该将数据驻留在instance数据库的只读表中?

5
使用窗口功能优化子查询
由于我的性能调优技能似乎永远不足,我一直想知道是否可以针对某些查询执行更多优化。这个问题涉及的情况是嵌套在子查询中的Windowed MAX函数。 我正在挖掘的数据是在较大组的各个不同组上的一系列事务。我有4个重要字段,一个事务的唯一ID,一批事务的Group ID以及与相应的唯一事务或一组事务相关的日期。多数情况下,组日期与批次的最大唯一交易日期相匹配,但是有时会通过我们的系统进行手动调整,并且在捕获组交易日期之后会进行唯一日期操作。此手动编辑不会通过设计来调整组日期。 我在此查询中识别的是那些唯一日期落在组日期之后的记录。以下示例查询建立了与我的场景大致相当的内容,并且SELECT语句返回了我要查找的记录,但是,我是否以最有效的方式来实现此解决方案?在我的事实表加载期间,这需要花一些时间,因为我的记录计数前9位数字,但是主要是我对子查询的鄙视使我怀疑这里是否有更好的方法。我不太担心任何索引,因为我相信它们已经存在。我正在寻找的是一种替代查询方法,该方法可以实现相同的功能,但效率更高。欢迎任何反馈。 CREATE TABLE #Example ( UniqueID INT IDENTITY(1,1) , GroupID INT , GroupDate DATETIME , UniqueDate DATETIME ) CREATE CLUSTERED INDEX [CX_1] ON [#Example] ( [UniqueID] ASC ) SET NOCOUNT ON --Populate some test data DECLARE @i INT = 0, @j INT = 5, @UniqueDate DATETIME, …

1
奇异的密度导致抽样统计
通过采样与全扫描进行估算时,NC指数获得完全不同的统计分布;采样的样本具有奇异的密度向量。这导致执行计划不佳。 我有一个约2700万行的表,并且非聚集索引支持一个非null的FK列。该表聚集在其主键上。两列都是varchar。 FK列的全扫描统计信息更新给出了正常外观的密度矢量: All density Average Length Columns 6,181983E-08 45,99747 INSTANCEELEMENTID 3,615442E-08 95,26874 INSTANCEELEMENTID, ID 也就是说,我们希望与之INSTANCELEMENTID连接的每个不重复读取约1.7行。 直方图中的典型bin如下所示: RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS FOOBAR 133053 10 71366 1,679318 但是,如果我们进行了抽样更新(使用此表的默认样本数为23万行),那么情况就变得奇怪了: 4,773657E-06 45,99596 INSTANCEELEMENTID 3,702179E-08 95,30183 INSTANCEELEMENTID, ID 现在的密度INSTANCEELEMENTID要大两个数量级。(但是,两根色谱柱的密度均已估算为可以接受的值)。 现在,直方图中的典型bin如下所示: RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS FOOBAR 143870,4 766,2573 1247 115,3596 ZOTZOT 131560,7 1 …

4
“ AlwaysOn”不总是“ Always On”吗?
我们创建了Windows故障转移群集,然后添加了两个SQL Server实例作为SQL Server故障转移群集的节点。 我们在SQL Configuration Manager中将服务器设置为使用“ AlwaysOn可用性组”。 为了测试故障转移,我加载并运行了一个长查询,然后通过使用故障转移群集管理器停止活动节点上的群集服务来关闭活动节点。 查询在没有连接的情况下中断,服务器在节点耗尽并新节点接管之前的20秒钟内显示为不可用。 我做错了吗?我应该如何配置它,以确保几乎没有连接丢失? AlwaysOn是否不总是开启?

2
为什么在BIGINT col上进行此搜索具有额外的常量扫描,计算标量和嵌套循环运算符?
当我查看某些查询的实际执行计划时,我注意到WHERE子句中使用的文字常量显示为计算标量和常量扫描的嵌套链。 要重现此,我使用下表 CREATE TABLE Table1 ( [col1] [bigint] NOT NULL, [col2] [varchar](50) NULL, [col3] [char](200) NULL ) CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC) 其中包含一些数据: INSERT INTO Table1(col1) VALUES (1),(2),(3), (-9223372036854775808), (9223372036854775807), (2147483647),(-2147483648) 当我运行以下(废话)查询时: SELECT a.col1, a.col2 FROM Table1 a, Table1 b WHERE b.col1 > 2147483648 我看到它将在Index Seek和标量计算(根据常量)的结果中进行嵌套循环绘制。 请注意,文字大于maxint。它确实有助于写作CAST(2147483648 …

3
无法插入到新创建的列中
我有一个像这样的简单测试表: CREATE TABLE MyTable (x INT); 在事务中,我尝试添加一列,然后插入到新创建的列中: BEGIN TRANSACTION; PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.'; ALTER TABLE MyTable ADD SupplementalDividends DECIMAL(18,6); PRINT 'Column added successfully....'; PRINT 'Ready to INSERT into MyTable ...'; INSERT INTO MyTable (x, SupplementalDividends) VALUES (1, 3.2); PRINT '**** CHANGES COMPLETE -- COMMITTING.'; COMMIT TRANSACTION; 当我运行上面的代码时,问题是一条错误消息: …

4
在触发器中是否为SELECT * OK。还是我在找麻烦?
我在工作中陷入一场辩论,我需要一些有关我可能会忽略的陷阱的建议。 想象一下使用触发器将已删除记录复制到审核表的情况。触发器使用SELECT *。每个人都指向并大喊,并告诉我们这有多糟糕。 但是,如果对主表的结构进行了修改,而忽略了审计表,则触发器将产生一个错误,使人们知道审计表也需要修改。 在我们的DEV服务器上进行测试的过程中将捕获该错误。但是我们需要确保生产匹配DEV,因此我们在生产系统中允许SELECT *(仅适用于触发器)。 所以我的问题是:我被迫删除SELECT *,但是我不确定如何确保我们自动捕获这种性质的开发错误,任何想法或这是最佳实践? 我在下面整理了一个例子: --Create Test Table CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255)) --Create Test Audit Table CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255)) --Create Trigger on Test CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; …

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.