我有两个链接的服务器,并且想要创建一个存储过程,该过程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。
我使用的是在 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(相同)
database_log 文件的大小 625MB(大约 300MB)
我们不能通过从表中清除不需要的/旧记录并重建索引来减小数据库的大小吗?
ps:database_log清除表后我的文件急剧增加,我不希望它变得太大。
我正在调查由两个并发 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 同时收到同一张表的 select 和 update 语句
他们中的任何一个得到优先考虑吗?我知道 select 语句会延迟到更新完成。如果表锁因更新而持续很长时间,select语句会因等待错误过多而被取消
那么当两者同时接收时会发生什么?
我的环境有 2 台 Windows Server 2012 R2 服务器,均带有 SQL Server 2014 昂贵版本。
每当 AG 中发生更改(例如:在可用性副本“SecondaryReplicaThatIRestarted”上为主数据库“AGDatabase”建立与辅助数据库的 AlwaysOn 可用性组连接)时,我会在 SQL 错误日志中收到如下错误:
来源:SPID52s
消息
DbMgrPartnerCommitPolicy::SetSyncState:00000003BFC0B0E0:1
以这样的结果结束:
编辑:
Windows 错误日志中没有任何内容,甚至没有提到的错误,这让我相信这是 SQL 内部的某些内容泄漏到错误日志中。
您知道这可能是由什么引起的吗?我已经设置了多个与此类似的设置,这是我第一次看到它。我计划本周将 SQL 修补到 SP1,但是我在发行说明中没有看到错误。
我们正处于从 SQL Server 2008 R2 升级到 SQL Server 2014 的规划阶段。
我们的系统针对不同服务器上的不同数据库执行存储过程。
如果我们将一台服务器升级到 SQL Server 2014,但将其余服务器留在 SQL Server 2008 R2 上,我们会失去这种能力吗?
我的数据库中有两个用户。当我在用户下执行以下查询时,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 Createdate,StartDate并且在数据库中EndDate有一个DateTime数据类型。
到目前为止我尝试过的:
删除了铸造cast(columnname as datetime)及其工作正常。
CONVERT(VARCHAR(10), Createdate, 101) >= CONVERT(VARCHAR(10), StartDate, 101) …Run Code Online (Sandbox Code Playgroud)我经常使用MERGE语句并且对它非常熟悉。现在我遇到了一些表的IDENTITY列不是主键的情况。在这种情况下,尽管在合并语句的生成脚本中检查了标识列的存在并且identity_insert在合并之前显式地打开了标识列,但脚本还是失败了。然而它仍然失败。
我为演示创建了一个较小的示例,该示例失败并抱怨IDENTITYColumn:
无法更新标识列“援助”。
我希望自从我转身之后Identity_Insert ON,我可以INSERT或我喜欢UPDATE的IDENTITY列的价值。但它不起作用。
这是示例代码:
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 2012 中的表中选择在 Oracle 11g 中创建表。
SQL Server 中的表包含列: hslakkis varchar(3)
在 Oracle 中,它创建了具有相同列但大小不同的表:
hslakkis varchar2(9)
这种行为导致我在 Oracle 中的列大小出现很多问题。如何防止 Oracle 增加列大小?
我有一个 MS Access 前端,我想在 5-7 台计算机上安装它,以便他们可以访问存储在共享网络驱动器上的 SQL Server:
如果可能,它是否安全,我的数据是否会损坏?否则,我如何让 5-7 个用户使用接口同时访问 SQL Server?
非常感谢您的宝贵时间!