既不引发错误也不完成规定行为的 TSQL 过程
TSQL procedure that neither raises an error nor completes prescribed behaviour
概览
我编写了一个更改列类型并对其应用唯一约束的过程。该过程成功执行并完成,但是,既没有更改列类型,也没有应用唯一约束。当我 SELECT @tsql
检查生成的语句并 运行 在 Azure Data Studio 中它们工作正常。同样,在任何时候都不会引发错误。
我使用的数据库服务是AzureSQL数据库实例.
程序
CREATE PROCEDURE [dbo].[usp_aProcName]
@tableName NVARCHAR(250),
@fieldName NVARCHAR(250)
AS
BEGIN TRY
DECLARE @tsql VARCHAR(MAX) = N'ALTER TABLE my_schema.'+@tableName+' ALTER COLUMN '+@fieldName+' INT NOT NULL;';
EXECUTE sp_executesql @tsql;
SET @tsql = N'ALTER TABLE my_schema.'+@tableName+' ADD CONSTRAINT AK_'+@tableName+'_'+@fieldName+' UNIQUE ('+@fieldName+');';
EXECUTE sp_executesql @tsql;
RETURN 0;
END TRY
BEGIN CATCH
RETURN @@ERROR;
END CATCH
;
有什么想法吗?
正在解决运行时错误;
动态 SQL 必须分配给 NVARCHAR
、NCHAR
或 NTEXT
类型,不是 VARCHAR
。 尽管在异常情况下返回 @@ERROR
,但错误已被捕获 但未显示在 Azure Data Studio 中。
错误旨在返回到编排层(Azure 数据工厂)并存储在另一个数据库中。错误处理改造(这是一个模拟);
CREATE PROCEDURE [dbo].[usp_aProcName]
@tableName NVARCHAR(250),
@fieldName NVARCHAR(250)
AS
BEGIN TRY
BEGIN TRAN TranName;
DECLARE @tsql VARCHAR(MAX) = N'ALTER TABLE my_schema.'+@tableName+' ALTER COLUMN '+@fieldName+' INT NOT NULL;';
EXECUTE sp_executesql @tsql;
SET @tsql = N'ALTER TABLE my_schema.'+@tableName+' ADD CONSTRAINT AK_'+@tableName+'_'+@fieldName+' UNIQUE ('+@fieldName+');';
EXECUTE sp_executesql @tsql;
COMMIT TRAN TranName;
END TRY
BEGIN CATCH
ROLLBACK TRAN TranName;
SELECT
OBJECT_NAME(@@PROCID) AS [ProcedureName],
ERROR_MESSAGE() AS [ErrorMessage],
ERROR_NUMBER() AS [ErrorNumber],
ERROR_LINE() AS [ErrorLine],
ERROR_SEVERITY() AS [ErrorSeverity],
ERROR_STATE() AS [ErrorState]
;
END CATCH
;
概览
我编写了一个更改列类型并对其应用唯一约束的过程。该过程成功执行并完成,但是,既没有更改列类型,也没有应用唯一约束。当我 SELECT @tsql
检查生成的语句并 运行 在 Azure Data Studio 中它们工作正常。同样,在任何时候都不会引发错误。
我使用的数据库服务是AzureSQL数据库实例.
程序
CREATE PROCEDURE [dbo].[usp_aProcName]
@tableName NVARCHAR(250),
@fieldName NVARCHAR(250)
AS
BEGIN TRY
DECLARE @tsql VARCHAR(MAX) = N'ALTER TABLE my_schema.'+@tableName+' ALTER COLUMN '+@fieldName+' INT NOT NULL;';
EXECUTE sp_executesql @tsql;
SET @tsql = N'ALTER TABLE my_schema.'+@tableName+' ADD CONSTRAINT AK_'+@tableName+'_'+@fieldName+' UNIQUE ('+@fieldName+');';
EXECUTE sp_executesql @tsql;
RETURN 0;
END TRY
BEGIN CATCH
RETURN @@ERROR;
END CATCH
;
有什么想法吗?
正在解决运行时错误;
动态 SQL 必须分配给 NVARCHAR
、NCHAR
或 NTEXT
类型,不是 VARCHAR
。 尽管在异常情况下返回 @@ERROR
,但错误已被捕获 但未显示在 Azure Data Studio 中。
错误旨在返回到编排层(Azure 数据工厂)并存储在另一个数据库中。错误处理改造(这是一个模拟);
CREATE PROCEDURE [dbo].[usp_aProcName]
@tableName NVARCHAR(250),
@fieldName NVARCHAR(250)
AS
BEGIN TRY
BEGIN TRAN TranName;
DECLARE @tsql VARCHAR(MAX) = N'ALTER TABLE my_schema.'+@tableName+' ALTER COLUMN '+@fieldName+' INT NOT NULL;';
EXECUTE sp_executesql @tsql;
SET @tsql = N'ALTER TABLE my_schema.'+@tableName+' ADD CONSTRAINT AK_'+@tableName+'_'+@fieldName+' UNIQUE ('+@fieldName+');';
EXECUTE sp_executesql @tsql;
COMMIT TRAN TranName;
END TRY
BEGIN CATCH
ROLLBACK TRAN TranName;
SELECT
OBJECT_NAME(@@PROCID) AS [ProcedureName],
ERROR_MESSAGE() AS [ErrorMessage],
ERROR_NUMBER() AS [ErrorNumber],
ERROR_LINE() AS [ErrorLine],
ERROR_SEVERITY() AS [ErrorSeverity],
ERROR_STATE() AS [ErrorState]
;
END CATCH
;