小编mar*_*c_s的帖子

无法为链接服务器的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务

我有两个链接的服务器,并且想要创建一个存储过程,该过程SELECT仅从第一台服务器的一个表中获取INSERT数据,并从第二个服务器中获取另一个表中的数据。

程序代码如下所示:

BEGIN TRAN

INSERT INTO [RI].[TEST_DB].[TEST_TABLE] (...)
SELECT ...
FROM [TABLE]

TRUNCATE [TABLE]

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

链接服务器“RI”的 OLE DB 访问接口“SQLNCLI11”返回消息“无法在此会话上启动更多事务。”。
消息 7395,级别 16,状态 2,过程 usp_test,第 46 行
无法为链接服务器“RI”的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务。
需要嵌套事务,因为 XACT_ABORT 选项设置为 OFF。

sql-server linked-server sql-server-2014

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

清除了表中的 100,000 多条记录,但数据库的大小没有减少

我使用的是在 Windows Server 2008 R2 Standard 上运行的 SQL Server 2008 R2 版本。我的数据库大小约为 207MB。由于它在一个表中包含 100 条记录,我决定只保留前 10000 条记录并删除剩余的记录以最小化数据库的大小。

我从数据库中删除了 90000 条记录,并重建了索引:

 DELETE FROM toptrends
 WHERE HandleID NOT IN (SELECT TOP 10000 HandleID
                        FROM toptrends
                        ORDER BY lastmodifieddatetime DESC)
 go

 ALTER INDEX ALL ON TopTrends
 REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
          STATISTICS_NORECOMPUTE = ON);
 GO
Run Code Online (Sandbox Code Playgroud)

并检查了数据库和database_log 文件的大小。该database_log文件的大小尺寸有所增加,但是数据库文件保持不变。我认为它应该减少

  • 删除前的文件大小:大约 207892
  • 删除后的文件大小:大约 207892(相同)

  • database_log 文件的大小 625MB(大约 300MB)

我们不能通过从表中清除不需要的/旧记录并重建索引来减小数据库的大小吗?

ps:database_log清除表后我的文件急剧增加,我不希望它变得太大。

sql-server

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

UPDATE WHERE 中的表扫描如何以未索引的列为谓词工作?

我正在调查由两个并发 UPDATE 语句引起的死锁:

UPDATE [table] 
SET [column] = 0 
WHERE [unindexed_column] = @id
Run Code Online (Sandbox Code Playgroud)

我的理解是,因为WHERE预测的列是未索引的,所以执行了全表扫描。对于每一行,获取一个更新锁。如果它与WHERE子句匹配,则它升级到排他锁并保持它直到语句完成。

当会话 A 拥有第 2 行的排他锁并试图获取第 1 行的更新锁,而会话 B 拥有第 1 行的排他锁并试图获取第 2 行的更新锁时,就会发生死锁。

死锁的原因是有道理的,但我不完全理解如何执行表扫描使这种情况成为可能。如果两个查询以相同的顺序执行扫描,最坏的情况似乎是其中一个查询在获取更新锁时被阻塞,直到另一个查询完成并释放它的锁。

表扫描是如何执行的?表格行的扫描顺序是否不一致?如果更新语句未能获得更新锁,它是否会转到下一行并稍后再次尝试上一行?究竟是什么让这种僵局成为可能?

sql-server deadlock sql-server-2008-r2 locking update

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

SQL Server 是否优先选择和更新语句?

假设 SQL Server 同时收到同一张表的 select 和 update 语句

他们中的任何一个得到优先考虑吗?我知道 select 语句会延迟到更新完成。如果表锁因更新而持续很长时间,select语句会因等待错误过多而被取消

那么当两者同时接收时会发生什么?

sql-server sql-server-2014

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

SQL Server 2014 可用性组 DbMgrPartnerCommitPolicy

我的环境有 2 台 Windows Server 2012 R2 服务器,均带有 SQL Server 2014 昂贵版本。

每当 AG 中发生更改(例如:在可用性副本“SecondaryReplicaThatIRestarted”上为主数据库“AGDatabase”建立与辅助数据库的 AlwaysOn 可用性组连接)时,我会在 SQL 错误日志中收到如下错误:

来源:SPID52s

消息
DbMgrPartnerCommitPolicy::SetSyncState:00000003BFC0B0E0:1

以这样的结果结束:

Imgur:错误日志的屏幕截图

编辑:

Windows 错误日志中没有任何内容,甚至没有提到的错误,这让我相信这是 SQL 内部的某些内容泄漏到错误日志中。

您知道这可能是由什么引起的吗?我已经设置了多个与此类似的设置,这是我第一次看到它。我计划本周将 SQL 修补到 SP1,但是我在发行说明中没有看到错误。

sql-server availability-groups error-log sql-server-2014

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

通过链接服务器从 SQL Server 2008 R2 到 SQL Server 2014 执行存储过程

我们正处于从 SQL Server 2008 R2 升级到 SQL Server 2014 的规划阶段。

我们的系统针对不同服务器上的不同数据库执行存储过程。

如果我们将一台服务器升级到 SQL Server 2014,但将其余服务器留在 SQL Server 2008 R2 上,我们会失去这种能力吗?

sql-server sql-server-2008-r2 linked-server sql-server-2014

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

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

我的数据库中有两个用户。当我在用户下执行以下查询时,ONE它成功执行;但是,当我在用户下执行它时,TWO它会生成一条错误消息:

询问:

select cast ('2015-04-28 16:00:00.000' as datetime)
Run Code Online (Sandbox Code Playgroud)

错误消息:

消息 242,级别 16,状态 3,第 11 行
varchar 数据类型到 datetime 数据类型的转换导致值超出范围。

用户ONE将英语作为默认语言,其简单的服务器登录
用户TWO将英国英语作为默认语言,也用作应用程序用户

数据库属性

在此处输入图片说明

因为在我的真实查询中,列是 inWhere子句来获取指定日期范围的结果集:

    CAST(CONVERT(VARCHAR(10), Createdate, 101) AS DATETIME) >= CAST(CONVERT(VARCHAR(10), StartDate, 101) AS DATETIME) 
    AND 
    CAST(CONVERT(VARCHAR(10), Createdate, 101) AS DATETIME) <= CAST(CONVERT(VARCHAR(10), EndDate, 101) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

我验证了 columns CreatedateStartDate并且在数据库中EndDate有一个DateTime数据类型。

到目前为止我尝试过的:

  1. 删除了铸造cast(columnname as datetime)及其工作正常。

    CONVERT(VARCHAR(10), Createdate, 101)  >= CONVERT(VARCHAR(10), StartDate, 101) …
    Run Code Online (Sandbox Code Playgroud)

sql-server

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

如果 Identity 不是主键,则 MERGE with IDENTITY_INSERT ON 不起作用

我经常使用MERGE语句并且对它非常熟悉。现在我遇到了一些表的IDENTITY列不是主键的情况。在这种情况下,尽管在合并语句的生成脚本中检查了标识列的存在并且identity_insert在合并之前显式地打开了标识列,但脚本还是失败了。然而它仍然失败。

我为演示创建了一个较小的示例,该示例失败并抱怨IDENTITYColumn:

无法更新标识列“援助”。

我希望自从我转身之后Identity_Insert ON,我可以INSERT或我喜欢UPDATEIDENTITY列的价值。但它不起作用。

这是示例代码:

CREATE TABLE [dbo].[tm2]
(
    [id] [int] NOT NULL,
    [aid] [int] IDENTITY(1,1) NOT NULL,
    [txt] [nchar](10) NULL,

    CONSTRAINT [PK_tm2] 
       PRIMARY KEY CLUSTERED ([id] ASC) 
            WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].tm2 ON

MERGE INTO [dbo].tm2 AS Target
USING (VALUES
  (1,2,'qdqewqf'),
  (2,3,'#ED7F00') …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 identity merge

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

在 Oracle 中创建表作为从 SQL Server 中选择 - varchar 大小

我正在尝试通过数据库链接从 SQL Server 2012 中的表中选择在 Oracle 11g 中创建表。

SQL Server 中的表包含列: hslakkis varchar(3)

在 Oracle 中,它创建了具有相同列但大小不同的表: hslakkis varchar2(9)

这种行为导致我在 Oracle 中的列大小出现很多问题。如何防止 Oracle 增加列大小?

oracle sql-server sql-server-2012

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

如果我将 MS-Access 前端(多台计算机)连接到 SQL Server 后端,我是否存在安全漏洞?

我有一个 MS Access 前端,我想在 5-7 台计算机上安装它,以便他们可以访问存储在共享网络驱动器上的 SQL Server:

在此处输入图片说明

如果可能,它是否安全,我的数据是否会损坏?否则,我如何让 5-7 个用户使用接口同时访问 SQL Server?

非常感谢您的宝贵时间!

ms-access sql-server

3
推荐指数
2
解决办法
137
查看次数