簡體   English   中英

SQL Server-SQL-從SELECT語句插入值

[英]SQL Server - SQL - INSERT VALUE from SELECT Statement

我們將不勝感激幫助:我想在更新同一數據列之前將值更新到審核表( 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]

謝謝

您可以使用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] = ?

請注意,我的示例只是一個一般性建議,可能需要進行調整才能執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM