[英]Invalid Column Error while using dynamic SQL
我第一次尝试使用动态 SQL。 有两组 SQL 可以根据条件执行。 尝试执行@sql4
, Else
部分执行正常,没有错误。 但是 SQL 的第一部分抛出了一个错误:
无效列/无法绑定多部分标识符“tp.Acquisition Date”
在这两种情况下使用的动态 SQL 是相同的,并且第一部分以某种方式抛出错误,指出无法识别 tp,这只是 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;
我想你在评论中得到了 APH 的回答。 您还从 Luuk 和 Lamu 那里得到了关于将sp_executesql @sql4
转换为select @sql4
或print @sql4
、将结果复制到编辑器并在那里查看错误消息的进一步建议。
但我会进一步建议您将插入内容构建到语句本身之外的动态语句中:
declare
@col_types nvarchar(max) =
Stuff((
SELECT N', ' + Concat('[' + Column_Name + ']', ' ', ColDT)
FROM #TempProp
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,2,N''),
@cols nvarchar(max) =
Stuff((
SELECT N', ' + '[' + Column_Name + ']'
FROM #TempProp
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,2,N''),
@col_aliases nvarchar(max) =
Stuff((
SELECT N', ' + Concat(TblAlias,'[' + Column_Name + ']')
FROM #TempProp
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,2,N'');
另请注意,我将任何column_name
括在括号中,这可能会解决另一个问题,因为“收购日期”的名称中有一个空格。
然后将它们作为变量插入:
declare @SQL4 NVARCHAR(MAX) = '
CREATE TABLE dbo.DIM_PROPERTY (' + @col_types + ');
IF (EXISTS (
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ''TEMP''
AND TABLE_NAME = ''PROPERTY''
))
BEGIN
INSERT INTO dbo.DIM_PROPERTY (' + @cols + ')
Select ' + @col_aliases + '
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 (' + @cols + ')
Select ' + @col_aliases + '
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
';
使用这种方法,您在编写代码时有更多机会避免或捕获错误(例如,更容易看到第二个查询缺少第一个具有的连接语句)。 更清楚的是,整个查询的“大局”意图是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.