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
;