SQL Server - SQL - SELECT语句中的INSERT VALUE

时间:2017-03-19 06:27:33

标签: sql sql-server tsql

非常感谢帮助:我想在更新同一数据列之前将值更新到审计表(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]

谢谢

1 个答案:

答案 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] = ?

注意,我的示例只是一般性建议,可能需要调整才能执行。