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