最近我不得不从以下项(完全正常)更改查询:
/****** 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语句,请验证每个列都有一个名称。对于其他语句,请查找空别名。不允许将别名定义为“”或[]。将别名更改为有效名称。字符串“。”后的引号引起来。
”附近的语法不正确。
我尝试检查语法-很好。
答案 0 :(得分:1)
SQL MERGE 似乎语法不正确。
WHEN NOT MATCHED BY T THEN
应该是Target
而不是 T :
WHEN NOT MATCHED BY Target
THEN .....