Azure sql database 既不引发错误也不完成指定行为的TSQL过程 概述

Azure sql database 既不引发错误也不完成指定行为的TSQL过程 概述,azure-sql-database,dynamic-sql,Azure Sql Database,Dynamic Sql,我编写了一个过程来更改列类型并对其应用唯一约束。但是,该过程成功执行并完成,列类型未更改,也未应用唯一约束。当我选择@tsql检查生成的语句并在Azure Data Studio中运行它们时,它们工作正常。同样,在任何时候都不会出现错误 我正在使用的数据库服务是Azure SQL数据库实例 程序 有什么想法吗?解决运行时错误 必须将动态SQL分配给NVARCHAR、NCHAR或NTEXT类型、非VARCHAR捕获到错误,但尽管在异常情况下返回了@@error,但该错误未显示在Azure Data

我编写了一个过程来更改列类型并对其应用唯一约束。但是,该过程成功执行并完成,列类型未更改,也未应用唯一约束。当我
选择@tsql
检查生成的语句并在Azure Data Studio中运行它们时,它们工作正常。同样,在任何时候都不会出现错误

我正在使用的数据库服务是Azure SQL数据库实例

程序
有什么想法吗?

解决运行时错误

必须将动态SQL分配给
NVARCHAR
NCHAR
NTEXT
类型、
VARCHAR
捕获到错误,但尽管在异常情况下返回了
@@error
,但该错误未显示在Azure Data Studio中

错误将返回到业务流程层(Azure数据工厂)并存储在另一个数据库中。重新建模的错误处理(这是一个模拟)


可以删除返回0并再次检查吗?我删除了
返回0子句并运行该过程。类型没有改变,也没有限制;行为是一样的。好吧,我想我已经看到了这个问题;变量
@tsql
VARCHAR
,应该是
NVARCHAR
。我不明白为什么SQL Server会接受这个错误。我希望第一个
sp_executesql
失败,点击
CATCH
并返回一个错误代码。您可以使用
PRINT@tsql
查看输出的差异。不-这不是一个要求。您应该这样做,因为对象名被定义为nvarchar(参数也是如此),但这不是必需的。您的问题是,您捕获了一个错误,但仅通过将错误代码用作过程的返回值就“吃掉了它”。Erland在Microsoft关于
sp_executesql
的文章中说“
@statement
是包含Transact-SQL语句或批处理的Unicode字符串。”。我做了改变,它执行了声明。向客户机返回错误代码是问题的另一部分。最初,我想将此代码返回Azure Data Factory,但当时正在Azure Data Studio中测试,没有在结果窗口中获得反馈。我可以引用
错误号()
等。。把它们寄回去。
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
;
CREATE PROCEDURE [dbo].[usp_aProcName]
    @tableName NVARCHAR(250),
    @fieldName NVARCHAR(250)
AS
    BEGIN TRAN TranName;
    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;
        
        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
;