【问题标题】:SQL MERGE Table with tableName带有 tableName 的 SQL MERGE 表
【发布时间】:2014-12-04 16:20:16
【问题描述】:

我想要一个通用过程来更新我的查找表。

CREATE TYPE S_Reference.[ReferenceType] as TABLE (
    [Id] SMALLINT NOT NULL PRIMARY KEY, 
    [Code] VARCHAR(16) UNIQUE NOT NULL, 
    [Rank] SMALLINT NOT NULL CHECK([Rank]>0),
    [Description] VARCHAR(128) NOT NULL,
    [Base] BIT NOT NULL DEFAULT 0);
GO

CREATE PROCEDURE [S_Reference].[P_B_ReferenceMerge]
    @Values [ReferenceType] READONLY,
    @TableName NVARCHAR(50)
AS

DECLARE @SQLQuery NVARCHAR(200)
SET @SQLQuery = 'SELECT * FROM ' + @TableName 

    MERGE INTO @SQLQuery Ori
    USING 
        @Values New
    ON (Ori.[Id] = New.[Id])
    WHEN MATCHED THEN
        UPDATE 
            SET Ori.[Code] = New.[Code],
                Ori.[Rank] = New.[Rank],
                Ori.[Description] = New.[Description],
                Ori.[Base] = New.[Base]
    WHEN NOT MATCHED THEN
        INSERT (Ori.[Id] , Ori.[Code], Ori.[Rank],Ori.[Description] ,Ori.[Base])
        Values (New.[Id] , New.[Code], New.[Rank],New.[Description] ,New.[Base]);
RETURN 0

但我不知道如何使用“tableName”? 我在 Ori 上遇到错误。[Id],我认为问题来自

 SET @SQLQuery = 'SELECT * FROM ' + @TableName 
        MERGE INTO @SQLQuery Ori

【问题讨论】:

  • 您为什么要尝试使用动态 SQL 来执行此操作,您实际上要做什么? MERGE INTO SELECT * FROM ' + @TABLENAME 语法不正确
  • @BS123 我想通过参数 AAValues 传递最后一个值的表。并通过参数 AATablename 传递目标表。该过程必须更新或插入 tableName 中的新值。

标签: sql sql-server tsql merge dynamic-sql


【解决方案1】:

如果能帮上忙,我就是这样做的。通过这种方式,您可以轻松管理查找中的值(c# 中的引用或枚举)。

首先是程序:

    CREATE TYPE S_Reference.[ReferenceType] AS TABLE (
    [Id] SMALLINT NOT NULL PRIMARY KEY, 
    [Code] VARCHAR(40) UNIQUE NOT NULL, 
    [Rank] SMALLINT UNIQUE NOT NULL CHECK([Rank]>0),
    [Description] VARCHAR(128) NOT NULL,
    [Base] BIT NOT NULL DEFAULT 0);
GO


CREATE PROCEDURE [S_Reference].[P_M_ReferenceMerge]
    @Values  S_Reference.[ReferenceType] READONLY,
    @TableName NVARCHAR(50)
AS

CREATE TABLE #NewValues (
    [Id] SMALLINT NOT NULL PRIMARY KEY, 
    [Code] VARCHAR(40) UNIQUE NOT NULL, 
    [Rank] SMALLINT UNIQUE NOT NULL CHECK([Rank]>0),
    [Description] VARCHAR(128) NOT NULL,
    [Base] BIT NOT NULL DEFAULT 0);

Insert INTO #NewValues
select * From @Values

DECLARE @SQLQuery NVARCHAR(MAX)
SET @SQLQuery = 
'DELETE 
FROM ' + @TableName + '
WHERE [Id] IN (SELECT [Id]
                FROM ' + @TableName + '
                EXCEPT
                SELECT [Id]
                FROM #NewValues)

MERGE INTO ' + @TableName + ' Ori 
USING #NewValues New 
ON (Ori.[Id] = New.[Id]) 
    WHEN MATCHED THEN 
    UPDATE 
        SET Ori.[Code] = New.[Code], 
        Ori.[Rank] = New.[Rank], 
        Ori.[Description] = New.[Description], 
        Ori.[Base] = New.[Base] 
    WHEN NOT MATCHED THEN 
    INSERT ([Id] , [Code], [Rank], [Description] ,[Base]) 
    Values (New.[Id] , New.[Code], New.[Rank], New.[Description] ,New.[Base]);'

EXEC sp_executesql @SQLQuery
RETURN 0

用法

INSERT INTO 
    @VALUES([Id],[Code],[Rank],[Description] ,[Base])
Values
    (1,'EUR',1,'EUR',0),
    (2,'GBP',2,'GBP',0),
    (3,'USD',3,'USD',0)
EXEC [S_Reference].[P_M_ReferenceMerge]
    @Values = @VALUES,
    @TableName = 'S_Reference.T_R_Currency'
DELETE FROM @VALUES

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多