我们希望将Transaction Level延迟持久性部署到我们的数据库。
COMMIT
我们的许多客户端SQL服务器都是2014年所以应该没问题,但我们仍然有一些客户端使用2010 - 问题是我们将相同的代码部署到所有客户端
如果我在审计日志中使用事务级别延迟持久性写入2014年前服务器会发生什么 - 他们会忽略它还是会出错?我知道在2014年如果没有打开DD,它就会被忽略 - 只是不确定2014年前服务器如何处理DELAYED DURABILITY = ON
(IF ELSE
)
我知道我可以进行版本检查并申请slicing
但不确定是否必要
感谢
答案 0 :(得分:0)
我在版本检查后尝试使用动态SQL,以便代码可以解析但不能在2014年前的服务器上运行(我们将代码部署到多个服务器类型,并且不想创建相同的2010,12,14版本代码)
DECLARE @SQL NVARCHAR (1000)
SELECT * FROM TBL_TEST_TABLE
SET @SQL = 'BEGIN TRANSACTION'
EXEC sp_executesql @SQL
SET @SQL = ''
INSERT INTO TBL_TEST_TABLE (TEST_COLUMN)
VALUES (2020)
SELECT * FROM TBL_TEST_TABLE
DECLARE @SQLVERSION NVARCHAR(128)
SET @SQLVERSION = CAST(SERVERPROPERTY('PRODUCTVERSION') AS NVARCHAR)
SET @SQLVERSION = SUBSTRING(@SQLVERSION, 1, CHARINDEX('.', @SQLVERSION) - 1)
IF @SQLVERSION < 12
BEGIN
SET @SQL = 'ROLLBACK'
EXEC sp_executesql @SQL
SET @SQL = ''
END
IF @SQLVERSION > 10
BEGIN
SET @SQL = 'COMMIT WITH (DELAYED_DURABILITY = ON)'
EXEC sp_executesql @SQL
SET @SQL = ''
END
SELECT * FROM TBL_TEST_TABLE
交易似乎有效,因为更新已提交,但我收到错误
EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 0,当前计数= 1。 和 EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0。
这纯粹是因为我正在使用动态SQL - 如果它实际提交的数据错误怎么回事?