繁体   English   中英

使用动态 SQL 时出现无效列错误

[英]Invalid Column Error while using dynamic SQL

我第一次尝试使用动态 SQL。 有两组 SQL 可以根据条件执行。 尝试执行@sql4Else部分执行正常,没有错误。 但是 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 @sql4print @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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM