参考下面sp_executesql单个输出参数,@I变量为动态列名,列名后缀n或是c,为了比较更新前后值是否发生了变化,分别做了两次SELECT取值,程代码冗余和产生不容忽视性能的问题。:
View Code
SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'n] FROM #inserted'
EXECUTE sp_executesql @sql,
N'@N DECIMAL(18,0) OUTPUT',
@Nn OUTPUT;
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'n] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@O DECIMAL(18,0) OUTPUT',
@On OUTPUT;
IF (ISNULL(@Nn,0) <> ISNULL(@On,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
EXECUTE sp_executesql @sql,
N'@N DECIMAL(18,0) OUTPUT',
@Nc OUTPUT;
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@O DECIMAL(18,0) OUTPUT',
@Oc OUTPUT;
IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
EXECUTE sp_executesql @sql,
N'@N DECIMAL(18,0) OUTPUT',
@Nn OUTPUT;
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'n] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@O DECIMAL(18,0) OUTPUT',
@On OUTPUT;
IF (ISNULL(@Nn,0) <> ISNULL(@On,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
EXECUTE sp_executesql @sql,
N'@N DECIMAL(18,0) OUTPUT',
@Nc OUTPUT;
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@O DECIMAL(18,0) OUTPUT',
@Oc OUTPUT;
IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
sp_executesql可以实现返回多个输出参数,改进代码:
View Code
DECLARE @sql NVARCHAR(MAX),@FName NVARCHAR(50)
DECLARE @Nn DECIMAL(18,0),@On DECIMAL(18,0),@Nc DECIMAL(18,0),@Oc DECIMAL(18,0)
SET @sql = N'SELECT @Nn = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Nc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
EXECUTE sp_executesql @sql,
N'@Nn DECIMAL(18,0) OUTPUT,@Nc DECIMAL(18,0) OUTPUT',
@Nn OUTPUT,@Nc OUTPUT;
SET @sql = N'SELECT @On = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Oc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@On DECIMAL(18,0) OUTPUT,@Oc DECIMAL(18,0) OUTPUT',
@On OUTPUT,@Oc OUTPUT;
IF (ISNULL(@Nn,0) <> ISNULL(@On,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
DECLARE @Nn DECIMAL(18,0),@On DECIMAL(18,0),@Nc DECIMAL(18,0),@Oc DECIMAL(18,0)
SET @sql = N'SELECT @Nn = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Nc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
EXECUTE sp_executesql @sql,
N'@Nn DECIMAL(18,0) OUTPUT,@Nc DECIMAL(18,0) OUTPUT',
@Nn OUTPUT,@Nc OUTPUT;
SET @sql = N'SELECT @On = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Oc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@On DECIMAL(18,0) OUTPUT,@Oc DECIMAL(18,0) OUTPUT',
@On OUTPUT,@Oc OUTPUT;
IF (ISNULL(@Nn,0) <> ISNULL(@On,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))
--EXECUTE [dbo].[usp_Audit_Insert] ...
更多相关:
http://www.cnblogs.com/insus/archive/2012/01/18/2325299.html