- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 SQLServer 2014,我有一个简单的数据库,其中有一个表,该表有一个 ID 和一个名为 data 的 varchar 列。当我运行以下语句时出现一些奇怪的行为:
SET XACT_ABORT ON
BEGIN TRANSACTION
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
SSMS 显示出现错误,因为我尝试在 sp_executesql
调用中运行不正确的查询。但是,它还显示 1 行受影响
。如果我在 testTable 上运行选择查询,我可以看到值“b”已插入。
如果我将语句包装在 TRY/CATCH
block 中,一切都会按预期工作,并且整个事务操作将回滚:
BEGIN TRANSACTION
BEGIN TRY
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
ROLLBACK
END CATCH
SET XACT_ABORT ON
不应该确保在出现问题时回滚整个事务吗?我缺少什么设置吗?
谢谢
最佳答案
发生这种情况是因为运行时语法错误未包含在 TRY
中/CATCH
不会中止事件事务,即使使用 XACT_ABORT
设置为ON
。关于什么会中止、什么不会中止以及在什么情况下中止的确切规则一点也不简单或明显。 Erland Sommarskog 有 an excellent write-up on error handling in general和 the rules of what does and doesn't abort in particular .
我不会在这里重现所有内容,但这里的问题归结为其要点:
SET XACT_ABORT ON -- or OFF, it makes no difference
BEGIN TRANSACTION
EXEC ('SELECT') -- Incorrect syntax near 'SELECT'
PRINT @@TRANCOUNT -- Prints 1, transaction is still going
COMMIT
PRINT @@TRANCOUNT -- Prints 0, transaction succeeded
尽管XACT_ABORT ON
,执行不仅不会停止,事务甚至不会中止。添加TRY
/CATCH
更改规则:
SET XACT_ABORT ON
BEGIN TRANSACTION
BEGIN TRY
EXEC ('SELECT') -- Incorrect syntax near 'SELECT'
PRINT 'After bad statement.' -- Does not print
COMMIT
END TRY
BEGIN CATCH
PRINT @@TRANCOUNT -- Prints 1, transaction is still going, but it's doomed
END CATCH
-- Error here:
-- 'Uncommittable transaction is detected at the end of the batch.
-- The transaction is rolled back.'
现在事务注定要失败,如果我们不自己回滚它,SQL Server 会为我们执行此操作(但会出现错误)。这种厄运完全归功于 XACT_ABORT
,因为关闭它会再次产生不同的结果:
SET XACT_ABORT OFF
BEGIN TRANSACTION
BEGIN TRY
EXEC ('SELECT') -- Incorrect syntax near 'SELECT'
PRINT 'After bad statement.' -- Does not print
COMMIT
END TRY
BEGIN CATCH
PRINT @@TRANCOUNT -- Prints 1, transaction is still going
END CATCH
PRINT @@TRANCOUNT -- Prints 1, transaction is still going!
ROLLBACK
这个故事的寓意是:T-SQL 中正确的错误处理非常棘手。通常对我有用的是SET XACT_ABORT ON
对于任何重要的批量语句,以及完全在 SQL Server 外部启动、提交或回滚事务(通过客户端代码)。这避免了理解什么会停止或破坏事务、什么不会停止或毁灭事务的许多困难,因为 SQL Server 传回客户端的任何错误最终都会导致回滚。但是,当然,即使这样也不是 Elixir 。
关于sql-server - 使用 SP_ExecuteSQL 时事务中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461213/
系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动态生成的Transact-SQL语句或批处理。Transact-SQL语句或批处理可以包
我捕获了一个由 Entity Framework 生成的查询,其中一个参数可以在 nvarchar(max) 中存储大量(400,000+ 个字符)的文本信息。 field 。我遇到的问题是,在执行语
我正在使用带参数的查询来创建数据库用户和 SQL Server 登录名。我有下一个程序: PROCEDURE [dbo].[regNewOfficial] @name nvarchar(30), @p
我正在 SQL Server 2005 中编写一个存储过程,在给定的时间点我需要执行另一个存储过程。这个调用是动态的,所以我像往常一样使用了 sp_executesql 命令: DECLARE @DB
尽管在将变量传递给 sp_executesql 时将变量声明为“游标”类型,但我收到错误“操作数类型冲突:nvarchar 与游标不兼容”。 declare CURSOR_TO_PASS cursor
我不明白为什么以下给我错误。我认为这与注释掉的部分有关,但@SQL 是 nvarchar(4000)。 BEGIN sp_executesql N'SELECT ''td''' --sp_ex
以下两个查询返回不同的结果。我知道差异与处理日期的时间部分的方式有关,但为什么会这样? // QUERY ONE select top 3 OrderDate from Orders where Or
我想从查询中获取 ID,但我得到的是 NULL,我的错误在哪里? DECLARE @TblZimz NVARCHAR(256) DECLARE @IdModul INTEGER DECLA
我正在调用一个存储过程并从我的 Windows 应用程序中传入 2 个日期作为参数。它返回所有行而不是我期望的 2 行。 存储过程是: ALTER procedure [dbo].[Get_Entri
在数据库表上运行 sp_executesql 时遇到一些问题。在本例中,我使用 ORM (NHibernate) 生成一个查询一个表的 SQL 查询。该表大约有 700 万条记录,并且索引很高。 当我
我正在调用一个存储过程并从我的 Windows 应用程序中传入 2 个日期作为参数。它返回所有行而不是我期望的 2 行。 存储过程是: ALTER procedure [dbo].[Get_Entri
我正在调用下面的代码。 在 (IDataReader dr = cmd.ExecuteReader()) sql barfs 行上,“CompanyUpdate”附近的语法不正确。 using
Msg 102, Level 15, State 1, Line 3 Incorrect syntax near '+'. 当你尝试执行下面这段代码时,会得到如上这个错误提
是否可以动态地向 sp_ExecuteSql 提供参数列表? 在 sp_ExecuteSql 中,查询和参数定义是字符串。我们可以为这些使用字符串变量,并传入我们想要执行的任何查询和参数定义。但是,在
我需要帮助将我的“用户定义表类型”参数传递给动态 sql sp_executesql。 这是我的示例代码: DECLARE @str as nvarchar(Max) DECLARE @IDLIST
有什么方法可以使用不依赖于它们在商店中定义的顺序的参数调用 sp_executesql 吗?与 exec 相同的查询效果很好,如果您有相同的顺序,它也可以很好地工作,但是必须一个一个地匹配参数很痛苦,
我需要执行一段动态 SQL,然后需要将结果存储到变量中。 我知道我可以使用 sp_executesql 但找不到有关如何执行此操作的明确示例。 最佳答案 如果你有 OUTPUT 参数,你可以这样做 D
我在执行下面的代码时遇到问题,它给出了如下错误: Msg 102, Level 15, State 1, Line 3 Incorrect syntax near '@ST'. 我可以尝试使用动态 S
我正在使用 C# 中的 Entity Framework ,并且遇到了一个问题,我已追踪到生成的 SQL 语句。 存储过程接受表值参数,但这似乎不是问题。 在 SQL Profiler 中,我看到正在
我有一个查询,它在 SQL Server Management Studio 中运行速度非常快,但在 sp_ExecuteSQL 下运行时运行速度非常慢。 这是否与在 sp_ExecuteSQL 下运
我是一名优秀的程序员,十分优秀!