【发布时间】:2020-06-16 03:56:40
【问题描述】:
我第一次尝试使用动态 SQL。根据条件执行两组 SQL。尝试执行@sql4 时,Else 部分执行良好,没有错误。但是 SQL 的第一部分抛出了一个错误:
无效列/无法绑定多部分标识符“tp.Acquisition Date”
在这两种情况下使用的动态 SQL 是相同的,并且不知何故第一部分会抛出一个错误,说 tp is not Recognized 这只是 Temp.property 表的别名。
Declare @SQL4 NVARCHAR(MAX)
SELECT @sql4=
'CREATE TABLE dbo.DIM_PROPERTY (' + Stuff(
(SELECT N', ' + Concat(Column_Name, ' ', ColDT) FROM #TempProp
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') + ');'
+
'IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ''TEMP''
AND TABLE_NAME = ''PROPERTY''))
BEGIN ' +
'INSERT INTO dbo.DIM_PROPERTY ('+ Stuff((SELECT N', ' + Column_Name FROM #TempProp
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') + ') ' +'Select ' + Stuff(
(SELECT N', ' + Concat(TblAlias,Column_Name) FROM #TempProp
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') +
' from (select imp.PROPERTY_MINI.propertyID as PropertyKey,* from imp.PROPERTY_MINI) mp
join Temp.PROPERTY tp on tp.PropertyKey = mp.PropertyID
left join imp.PROPERTY_PHOTO_VIEWER pv
ON mp.PropertyID = pv.PropertyID
END
ELSE
BEGIN
INSERT INTO dbo.DIM_PROPERTY ('+ Stuff((SELECT N', ' + Column_Name FROM #TempProp
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') + ') ' +'Select ' + Stuff(
(SELECT N', ' + Concat(TblAlias,Column_Name) FROM #TempProp
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'') +
' from (select imp.PROPERTY_MINI.propertyID as PropertyKey,* from imp.PROPERTY_MINI) mp
left join imp.PROPERTY_PHOTO_VIEWER pv
ON mp.PropertyID = pv.PropertyID
END'
exec sp_executesql @SQL4;
【问题讨论】:
-
嗨 Priya - 欢迎来到 Stack Overflow。通过添加minimal reproducible example,您可能会为这个问题吸引更好的答案。
-
当然,添加了 sql 以更详细地显示错误。请查看并发表评论。
-
将
exec sp_executesql @SQL4;替换为select @SQL4。这样你就可以检查你的 SQL 语句了。 -
看起来当您达到
else条件时,您只有两个表,别名为mp和pv。这就是为什么您在尝试从该部分中别名为tp的表格中进行选择时遇到错误的原因。 -
我建议
PRINTing 或SELECTing 你的动态语句的值并调试它;然后将该修复传播到创建它的 SQL。我还建议使用QUOTENAME正确引用您的动态对象名称。
标签: sql sql-server dynamic