非常感谢帮助:我想在更新同一数据列之前将值更新到审计表(dbo.Audit
)。
我有SELECT
语句来检索存储在表dbo.[RuleSet]
列[SelectStatement]
中的值(使用动态SQL创建)。
问题:我不确定如何更新Audit
表。
CREATE TABLE [dbo].[Audit]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[UpdateID] [int] NULL,
[TableName] [varchar](250) NULL,
[Orig] [varchar](250) NULL
)
CREATE TABLE [dbo].[RuleSet]
(
[UpdateID] [int] IDENTITY(1,1) NOT NULL,
[VID] [int] NULL,
[TableName] [varchar](250) NOT NULL,
[SetColumn] [varchar](250) NOT NULL,
[SetValue] [varchar](250) NOT NULL,
[WhereClause] [varchar](256) NULL,
[SelectStatement] [varchar](4000) NULL
)
INSERT [dbo].[RuleSet] ([UpdateID], [VID], [TableName], [SetColumn], [SetValue], [WhereClause], [SelectStatement])
VALUES (1, 1, N'TableA', N'ColumnA', N'10', N'ColumnA > 10', N'SELECT ColumnA FROM TableA WHERE ColumnA > 10')
INSERT [dbo].[RuleSet] ([UpdateID], [VID], [TableName], [SetColumn], [SetValue], [WhereClause], [SelectStatement])
VALUES (3, 2, N'TableB', N'ColumnB', N'20', N'ColumnB > 20', N'SELECT ColumnB FROM TableB WHERE ColumnB > 20')
GO
我想要实现的代码的逻辑是:
INSERT INTO [dbo].[Audit]([UpdateID], [TableName], [Orig])
SELECT
[UpdateID], [TableName],
--Value returned from executing the SELECT statement in column[SelectStatement]
FROM
dbo.[RuleSet]
谢谢
答案 0 :(得分:1)
您可以使用EXECUTE sp_executesql执行[SelectStatement]
并将结果存储在临时表或变量中。然后将其用作子查询以插入[dbo].[Audit]
。
如果您将查询存储在这样的[SelectStatement]
中,您可以让自己变得更容易。
N'SELECT ColumnB INTO #TempB FROM TableB WHERE ColumnB > 20'
然后你可以使用sp_executesql执行它并从TempB
中选择插入。
EXECUTE sp_executesql (SELECT [SelectStatement] FROM [dbo].[RuleSet] where [UpdateID] = ?);
INSERT INTO [dbo].[Audit ] ([UpdateID], [TableName], [Orig])
SELECT [UpdateID], [TableName], #TempB.*
FROM dbo.[RuleSet], #TempB
WHERE [UpdateID] = ?
注意,我的示例只是一般性建议,可能需要调整才能执行。