Sql server 存储过程中的T-SQL Merge语句引发错误

Sql server 存储过程中的T-SQL Merge语句引发错误,sql-server,tsql,Sql Server,Tsql,最近,我不得不更改以下查询(完全有效): 以下各项(不工作): 但是,当我运行该程序时,出现以下错误: 对象或列名丢失或为空。对于SELECT INTO语句,请验证每个列都有名称。对于其他语句,请查找空别名。不允许使用定义为“”或[]的别名。将别名更改为有效名称。字符串“”后未关闭的引号。 “”附近的语法不正确 我试着检查语法,结果很好。对于SQLMERGE来说,语法似乎不正确 如果未与T匹配,则应为目标非T: WHEN NOT MATCHED BY Target THEN .....

最近,我不得不更改以下查询(完全有效):

以下各项(不工作):

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

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


我试着检查语法,结果很好。

对于SQLMERGE来说,语法似乎不正确

如果未与T匹配,则
应为
目标
T

WHEN NOT MATCHED BY Target 
   THEN .....

调试动态SQL的第一个技巧是打印SQL字符串,然后将其作为本机SQL进行调试。e、 g.在
执行sp_executesql
之前,添加一行
打印(@SQLString)
提示:将对象名称组合到动态SQL语句中的最佳实践是避免出现奇数名称问题,例如使用空格或保留字(如
From
)的
新表,但是,我仍然收到相同的错误。您可以共享您的UDT脚本吗?[dbo].[ForeSightData]不幸不是数据库中的实际表。如您所见,它只在存储过程中出现。它与我插入的表的定义相同。下面是它的脚本:`SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE[dbo].[MyTable]([ID][nvarchar](255)NULL,[BrandName][nvarchar](255)NULL,[PRIMARY]GO`@CornelisdeJager上的[advername][nvarchar 255)NULL,[WCPM float]NULL,
@Results
的值是多少?
/****** 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
WHEN NOT MATCHED BY Target 
   THEN .....