我可以在触发器中动态指定数据库名称吗?

时间:2013-04-12 09:31:27

标签: sql-server tsql

我需要从数据库中的表中获取数据,在触发期间,数据库名称将被确定为变量。然后,我知道这个变量需要从确定的数据库中的表中获取一个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))

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

2 个答案:

答案 0 :(得分:0)

来自: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方法,如上所示。这应该可以解决问题。

答案 1 :(得分:0)

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

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