【问题标题】:Can I specify a database name dynamically in a trigger?我可以在触发器中动态指定数据库名称吗?
【发布时间】:2013-04-15 12:07:18
【问题描述】:

我需要从数据库中的表中获取数据,其数据库名称将在触发器期间被确定为变量。然后,我知道此变量需要从已确定数据库中的表中获取一个项目的 seqno,该项目在触发器期间也被确定为变量。
我正在尝试这条路线,因为我假设我需要在将 SQL 语句设置为变量之前构建它。 这不起作用,我需要知道如何做到这一点的最佳方法:

DECLARE @SU_SEQNO INTEGER, @SU_NAME VARCHAR(50), @SU_OWNER VARCHAR(15), @SUD_SEQNO INTEGER, @SQL NVARCHAR(500)

SET @SU_OWNER = 'XXX'
SET @SU_NAME = '1ABC234'

SET @SQL ='SELECT @SUD_SEQNO=SEQNO FROM ' + (@SU_OWNER) + '.SU_MAIN 
              WHERE UNITNAME= ' + @SU_NAME 
SET @SUD_SEQNO = (EXECUTE (@SQL))

非常感谢您对此的任何帮助

【问题讨论】:

  • 这是在 MS SQL Server 中吗?
  • “触发期间” - 我通常建议不要在触发期间访问当前数据库之外的 anything。通常最好将此类活动排队(使用例如队列或服务器代理的表)并且不要将原始事务延长太久。此外,与触发器相关,标量变量的存在通常表明作者不知道inserteddeleted 可以包含多行 行(或零行)

标签: sql-server tsql


【解决方案1】:

发件人:Get result from dynamic SQL in stored procedure

SET @SQL = N'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource;
EXEC sp_executesql @SQL, N'@FiscalYear INT OUTPUT', @FiscalYear OUTPUT;

PRINT @FiscalYear;

我会重新设计以使用如上所示的 sp_executesql 方法。这应该可以解决问题。

【讨论】:

  • 谢谢你,我已经重新设计了它,但我对如何使用 sp_executesql 感到困惑。我的代码是:
【解决方案2】:

我已经修改了代码,它可以工作

declare @su_owner varchar(15) = 'DBTEST'
declare @SU_SEQNO INTEGER=1, @SUD_SEQNO INTEGER=0, @SQL NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500), @SU_NAME_INPUT VARCHAR(50)='SU123'

SET @SU_NAME_INPUT = (SELECT UNITNAME FROM SU_MAIN WHERE SEQNO=@SU_SEQNO)
SET @SU_NAME = (SELECT UNITNAME FROM SU_MAIN WHERE SEQNO=@SU_SEQNO)

SET @SQL = N'SELECT @sud_seqnoOUT=MAX(SEQNO) FROM ' + quotename(@su_owner) + '.[dbo].[SU_MAIN] WHERE UNITNAME]=@SU_NAME_INPUT' ;

SET @ParmDefinition = N'@SU_NAME_INPUT VARCHAR(50),@sud_seqnoOUT INT OUTPUT'

EXEC sp_executesql @SQL,@ParmDefinition,@SU_NAME_INPUT = @SU_NAME,
            @sud_seqnoOUT = @SUD_SEQNO OUTPUT

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多