2016-02-26 51 views
0
BEGIN TRY 
    BEGIN TRANSACTION 
SET ANSI_NULLS ON 
Go 

SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION dbo.RerurnStaticValue 
(
@value nvarchar(10) 
) 
RETURNS varchar(max) 
AS 
    BEGIN 

     DECLARE 
     @ReturnValue nvarchar(10) 
     SET @ReturnValue = @value 
     RETURN @ReturnValue 
    END 
     COMMIT TRAN -- Transaction Success! 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRAN --RollBack in case of Error 
    select ERROR_MESSAGE() 
END CATCH 

我准备了很长的脚本,并尝试在脚本执行交易这样的情况下,是否会有我的脚本中的任何错误也不会影响我数据库。但是我得到的错误创建函数必须是批处理执行事务时的唯一语句。无法使用与围棋语句事务在SQL Server 2008中

请帮忙。

+0

'GO'不是一个SQL关键字,它只是SSMS中的一个批处理分隔符,所以它所做的就是将脚本拆分为块并分别处理它们。所以单个事务不能跨越多个批次。但从上述情况来看,为什么你不愿意。你实际上没有触及任何数据...... – GarethD

+1

为什么你需要在这里进行交易?你需要exec()一个'create function'字符串,它清楚地告诉你*创建函数必须是批处理中的唯一语句*。 ('GO'是一个特殊的关键字,仅用于SSMS等实用程序来指示批次的结束) –

回答

0

我觉得功能documentation是相当清楚的:

用户定义函数不能用于执行修改 数据库状态的操作。

COMMIT/ROLLBACK绝对属于这一类。

改为使用存储过程。

相关问题