有些程序可以手动运行但不能在作业中运行,或者在从应用程序运行时失败,或者在 SSIS SQL 任务中无法运行。
我的工作在所有会话中,但一个。
这是我正在运行的代码 - 它调用一个存储过程,该过程获取触发器定义并将其保存在临时表中。
工作正常,这是我自动化工作的一部分。
IF OBJECT_ID('tempdb.dbo.#Jagannatha_sp_getTriggerDef') IS NOT NULL
DROP TABLE #Jagannatha_sp_getTriggerDef
CREATE TABLE #Jagannatha_sp_getTriggerDef (
DB sysname not null,
parent_name nvarchar(600) not null,
object_id int not null,
trigger_name sysname not null,
is_disabled bit,
i int not null,
[trigger_definition] NVARCHAR(MAX) not null,
primary key clustered (DB,trigger_name,i))
truncate table #Jagannatha_sp_getTriggerDef
exec sp_getTriggerDef @dbname = 'APCore',
@TableName = 'dbo.receivedLog',
@Drop_ONly = 0,
@Radhe = '#Jagannatha_sp_getTriggerDef'
SELECT *
FROM #Jagannatha_sp_getTriggerDef
order by db,i
我在没有触发器的表上运行它 - 只是为了让它尽可能简单
它带有警告
IF 'my_server\_DEVELOPMENT' <> @@ServerName THROW 50001, 'Wrong Server!!!',1
都好。
但是在这个特定的会话中:
到目前为止,我可以发现本次会议没有什么不同。
SELECT *
FROM sys.dm_exec_sessions
where login_name = 'my_company\my_user'
and session_id = @@SPID
第二个是失败的地方。所有其他它工作正常。
我该怎么做才能找出不同之处?甚至更好的是,更改程序以便尽管存在差异,但它仍然可以工作?
我找到了解决这个问题的方法。我找不到也没有花时间去理解为什么只有一个会话有这个问题。
我的这个过程是用动态 sql打包的,它在内部使用了一个名为
#Radhe
.我正在动态 sql
#Radhe
中创建临时表。我决定做一些不同的事情:
#Radhe
我将有一个名为的临时表##Radhe
,它是在动态 sql之外创建的,但在其中以相同的方式使用。在这种情况下,这对我有用。
这是存储过程中代码的部分视图:
这是动态 sql 代码的另一个一瞥:
执行几个动态 sql 块并将结果写入表 - 如果提供了参数,或者只是一个选择。
这是执行此过程的结果示例 - 删除数据库中所有触发器的脚本(请记住,有两种不同类型的触发器):
更新
现在我知道发生了什么,因为我可以重现错误。我也可以避免。我还将共享临时表更改
##Radhe
为在动态 sql 中创建的临时表,这正是我需要的地方。它被称为#Jagannatha_Baladeva
。我调用的存储过程
sp_getTriggerDef
接受一个临时表名参数,我用它来返回生成的脚本。当我创建这个临时表并且名称与我的过程中的一个临时表的名称相同时,就会出现问题。
因此,因为有一个名为
#Jagannatha_Baladeva
INSIDE my stored procedure 的表,如果在外部创建同名表,我可能会遇到奇怪的情况。为了清楚起见,在外部表中,我命名了第一列
DB5 sysname not null,
,但在表 INSIDE 我的过程中,调用了相同的列,DB sysname not null,
因此当我运行以下代码时:我得到了我原来的错误:
我将列名更改为
DB
,临时表名更改为,#some_other_table_name
但我仍然遇到相同的错误,直到我在SSMS中打开另一个会话并再次运行代码:然后它工作正常:
我希望我有更多的代表,所以我可以对Marcello 的回答发表评论......
但我建议不要使用全局临时表,因为它们通常存在安全风险,因为任何会话都可以访问它的内容。
只需将其设为您自己管理的实际表格...