我有一个插入触发器,其中包含存储为 XE2 项目资源的动态 sql。它还包含数据库名称和表名称的占位符,当 Delph 代码运行以执行 SQL 时,这些占位符将被替换。
最初我对 SqlExpress 数据库使用 DevArt SQL Server 驱动程序,但现在我想对 LocalDB 数据库使用 ODBC 和 SQL Native Client 驱动程序。
我发现我原来的创建触发器脚本不再起作用。
我正在使用 TSQLQuery.ExecSQL 来执行我的 SQL 命令。
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [#DatabaseName#].[dbo].[#TableName#] FOR INSERT
导致
'[Microsoft][SQL Server Native Client 11.0][SQL Server]无法在 'EvaluationCompany_COPYDB.dbo.COPY_PRODUCTS' 上创建触发器,因为目标不在当前数据库中。
我使用的解析器类确实将 GO 关键字处的 SQL 脚本拆分为单独的语句,所以我修改了我的创建触发器脚本说
USE [#DatabaseName#]
GO
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [dbo].[#TableName#] FOR INSERT
这就是你在 SSMS 中要做的,但那说
'[Microsoft][SQL Server Native Client 11.0][SQL Server]对象 'dbo.COPY_PRODUCTS' 不存在或对此操作无效。'
可能是因为 CREATE 的“当前数据库”不是 USE 设置的,因为它似乎被遗忘了。
我尝试了将sql语句串成单个执行的常用方法
USE [#DatabaseName#];
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [dbo].[#TableName#] FOR INSERT
但这引发了预期
'[Microsoft][SQL Server Native Client 11.0][SQL Server]'CREATE TRIGGER' 必须是查询批处理中的第一条语句。'
所以我将整个 CREATE...END 包装在 EXEC [#DatabaseName#].[sys].[sp_ExecuteSQL] N' ' 中并尝试执行它。如果我将字符串变量的内容粘贴到 SSMS 中,它执行得很好,但是当传递给 ExecSQL 时,它会说
'[Microsoft][SQL Server Native Client 11.0][SQL Server]对过程'sp_executesql'的请求失败,因为'sp_executesql'是一个过程对象。'
这有点荒谬。所以现在我不知道如何使用 dbExpress 和 SQL Server 本机客户端在表上创建触发器。