首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要解决无效列名错误的建议

需要解决无效列名错误的建议
EN

Stack Overflow用户
提问于 2020-08-15 02:19:31
回答 1查看 46关注 0票数 1

我是一个SQL新手,正在尝试解决我的前辈留下的代码问题。当我说新手时,它意味着我已经完成了几门入门级别的在线课程。

我正在使用连接到雇主服务器的SSMS。下面是违规代码的一部分。据我所知,代码指向一个名为Revenue DM copy的数据库。该数据库中有一个名为GPT Dashboard的表。表GPT Dashboard是通过命令"Select * into dbo.GPT Dashboard from dbo.GPT Dashboard SFDC“从名为GPT Dashboard SFDC的表中填充数据的。我已经验证了此更新工作正常,这意味着所有数据都将被传输。下一行代码通过添加7个以UPH1开头、以产品名称结尾的新列来更改GPT Dashboard表。

下一节是代码翻转的地方。表GPT Dashboard通过将前面提到的7列设置为与第三个表中包含的值相等的方式进行更改,该表称为Product UPH映射。我已经验证了这7列确实存在于Product UPH映射中。添加到GPT Dashboard的所有七个新列的下面都有一条红色的曲折线条,请参见以下代码。这些错误会阻止代码执行。

此代码的行为类似于Alter Table,并且后续的Add命令不会执行。我尝试过插入GO语句,并以小批量和无序的顺序运行代码,但没有成功。任何建议都是非常感谢,但请保持回复非常simple...like与一个5岁的孩子说话简单。是的,我就是这样的菜鸟!

谢谢!

代码语言:javascript
运行
复制
USE [Revenue DM Copy]
GO
/****** Object:  StoredProcedure [dbo].[SP_02_GPT_Dashboard]    Script Date: 7/23/2020 1:27:32 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================

CREATE OR ALTER PROCEDURE dbo.SP_02_GPT_Dashboard
    -- Add the parameters for the stored procedure here
AS
BEGIN
SET NOCOUNT ON
-- Insert statements for procedure here
-- Input Tables
-- select count(*) from [dbo].[GPT Dashboard SFDC]
-- select * from [dbo].[Product UPH mapping]

IF OBJECT_ID('[dbo].[GPT Dashboard]', 'U') IS NOT NULL 
drop table [dbo].[GPT Dashboard]
select * into [dbo].[GPT Dashboard] from [dbo].[GPT Dashboard SFDC]

Alter table [dbo].[GPT Dashboard]
add [UPH1] varchar(100),
    [UPH2] varchar(100),
    [UPH3] varchar(100),
    [UPH4] varchar(100),
    [UPH5] varchar(100),
    [UPH6] varchar(100),
    [Product Name] varchar(500)
update [dbo].[GPT Dashboard]
set [dbo].[GPT Dashboard].[UPH1] = [dbo].[Product UPH mapping].[UPH1], --Red line under first instance of UPH1 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[UPH2] = [dbo].[Product UPH mapping].[UPH2], --Red line under first instance of UPH2 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[UPH3] = [dbo].[Product UPH mapping].[UPH3], --Red line under first instance of UPH3 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[UPH4] = [dbo].[Product UPH mapping].[UPH4], --Red line under first instance of UPH4 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[UPH5] = [dbo].[Product UPH mapping].[UPH5], --Red line under first instance of UPH5 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[UPH6] = [dbo].[Product UPH mapping].[UPH6], --Red line under first instance of UPH6 right after [GPT Dashboard].
    [dbo].[GPT Dashboard].[Product Name] = [dbo].[Product UPH mapping].[Product_Name] --Red line under first instance of product name right after [GPT Dashboard].
from
    [dbo].[GPT Dashboard]
inner join
    [dbo].[Product UPH mapping]
on
    [dbo].[GPT Dashboard].[Quote_Product_Part_Number] = [dbo].[Product UPH mapping].[Oracle_CPQ_Cloud_Part_Number]
EN

回答 1

Stack Overflow用户

发布于 2020-08-15 02:51:08

更新将首先被解析以进行有效性检查,它将发现这些列还不存在。解析器无法读取所有代码并确定更新运行时的结束状态;它只能依赖于从SELECT INTO获得的信息。(有趣的是,如果您首先使用CREATE TABLE定义表,则可以很好地工作。)

因此,不是:

代码语言:javascript
运行
复制
SELECT * INTO dbo.foo FROM ...;
ALTER TABLE dbo.foo ADD bar int;
UPDATE dbo.foo SET bar = 5;

您必须使用动态SQL引用任何在创建时不存在的列:

代码语言:javascript
运行
复制
SELECT * INTO dbo.foo FROM ...;
ALTER TABLE dbo.foo ADD bar int;
EXEC sys.sp_executesql N'UPDATE dbo.foo SET bar = @bar;', N'@bar int', 5;

在SSMS中,您可以通过将语句分成单独的批处理来解决此问题,例如

代码语言:javascript
运行
复制
SELECT * INTO dbo.foo FROM ...;
GO
ALTER TABLE dbo.foo ADD bar int;
GO
UPDATE dbo.foo SET bar = 5;

但是GO不是T-SQL,它是SSMS中的批处理分隔符,不能在存储过程中使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63418116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档