存储过程中的T-SQL Merge语句抛出错误

时间:2019-12-04 01:23:20

标签: sql-server tsql

最近我不得不从以下项(完全正常)更改查询:

/****** WORKING ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [operations].[ROIWarehouseDatas]
    (@Operation VARCHAR(50)    = NULL,
     @TableName NVARCHAR(255)  = NULL,
     @Results [dbo].[ForeSightData] READONLY) 
AS
BEGIN
    DECLARE @err INT
    SET @err = 0

    IF (@Operation = 'Insert')
    BEGIN
        DECLARE @SQLString NVARCHAR(4000)
        DECLARE @ParamDefinition NVARCHAR(4000)

        SET @SQLString = N'TRUNCATE TABLE ['+ @TableName + N'];
                           INSERT INTO ['+ @TableName + N']
                               SELECT [ID], [BrandName], [AdvertName], [VersionName], [WCPM]
                               FROM @Results;';

        SET @ParamDefinition = N'@Operation VARCHAR(50), @Results [dbo].[ForeSightData] READONLY';

        EXECUTE sp_executesql  @SQLString, @ParamDefinition, @TableName, @Results
    END
    --ENDIF Insert

    SET @err = @@ERROR
    RETURN @err
END

针对以下内容(无效):

/****** NOT WORKING ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [operations].[ROIWarehouseDatas]
    (@Operation VARCHAR(50)    = NULL,
     @TableName NVARCHAR(255)  = NULL,
     @Results [dbo].[ForeSightData] READONLY) 
AS
BEGIN
    DECLARE @err INT
    DECLARE @SQLString NVARCHAR(4000)
    DECLARE @ParamDefinition NVARCHAR(4000)

    SET @err = 0

    IF (@Operation = 'Insert')
    BEGIN
        SET @SQLString = N'MERGE INTO ['+ @TableName +'] AS T
                           USING @Results AS S ON T.ID = S.ID
                           WHEN MATCHED 
                               THEN UPDATE 
                                    SET T.[BrandName] = S.[BrandName],
                                        T.[AdvertName] = S.[AdvertName],
                                        T.[VersionName] = S.[VersionName],
                                        T.[VersionDuration] = S.[VersionDuration],
                                        T.[WCPM] = S.[WCPM]
                           WHEN NOT MATCHED BY TARGET 
                               THEN INSERT ([ID], [BrandName], [AdvertName], [VersionName], [WCPM])
                                    VALUES (S.[ID], S.[BrandName], S.[AdvertName], S.[VersionName], S.[WCPM]);';
        SET @ParamDefinition = N'@Operation VARCHAR(50), @Results [dbo].[ForeSightData] READONLY';

        EXECUTE sp_executesql  @SQLString, @ParamDefinition, @TableName, @Results
    END
    --ENDIF Insert

    SET @err = @@ERROR
    RETURN @err
END

但是,当我运行程序时,出现以下错误:

  

对象或列名称丢失或为空。对于SELECT INTO语句,请验证每个列都有一个名称。对于其他语句,请查找空别名。不允许将别名定义为“”或[]。将别名更改为有效名称。字符串“。”后的引号引起来。
  ”附近的语法不正确。

我尝试检查语法-很好。

1 个答案:

答案 0 :(得分:1)

SQL MERGE 似乎语法不正确。

WHEN NOT MATCHED BY T THEN应该是Target而不是 T

WHEN NOT MATCHED BY Target 
   THEN .....