Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 需要关于解决无效列名错误的建议吗_Sql Server_Ssms - Fatal编程技术网

Sql server 需要关于解决无效列名错误的建议吗

Sql server 需要关于解决无效列名错误的建议吗,sql-server,ssms,Sql Server,Ssms,我是一个SQL新手,试图对我的前任留下的代码进行故障排除。当我说新手时,这意味着我已经完成了几门入门级的在线课程 我正在使用连接到雇主服务器的SSM。下面是违规代码的一部分。据我所知,代码指向一个名为Revenue DM copy的数据库。在这个数据库中有一个名为GPT Dashboard的表。表GPT Dashboard由名为GPT Dashboard SFDC的表中的数据通过命令Select*从[dbo].[GPT Dashboard SFDC]填充到[dbo].[GPT Dashboard

我是一个SQL新手,试图对我的前任留下的代码进行故障排除。当我说新手时,这意味着我已经完成了几门入门级的在线课程

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

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

此代码的作用类似于Alter Table,后续的Add命令不会执行。我尝试过插入GO语句,并以小批量和无序顺序运行代码,但没有成功。任何建议都非常感谢,但请保持回答非常简单…就像和一个5岁的孩子说话一样简单。是的,我就是那个绿色的

谢谢

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]

将首先解析更新以进行有效性检查,它将发现这些列还不存在。解析器无法读取所有代码并确定更新运行时的最终状态;它只能依赖于从SELECT INTO中知道的内容。有趣的是,如果您首先使用CREATETABLE定义表,它就可以正常工作

因此,不是:

SELECT * INTO dbo.foo FROM ...;
ALTER TABLE dbo.foo ADD bar int;
UPDATE dbo.foo SET bar = 5;
您必须使用动态SQL引用创建时不存在的任何列:

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中,您可以通过将语句分成单独的批来解决这个问题,例如

SELECT * INTO dbo.foo FROM ...;
GO
ALTER TABLE dbo.foo ADD bar int;
GO
UPDATE dbo.foo SET bar = 5;

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

你好,亚伦,谢谢。您要说的是,update命令与select*into命令生成的列名进行比较,即使select*into和update命令之间有Alter Table命令?奇怪的Exec sys.sp。。。。命令强制在update命令之前执行Alter Table命令?我尝试了几个Exec sys.sp的迭代。。。。建议,我还没有正确运行它。我会继续删减。是的,解析器基本上忽略了ALTER。将其放入动态SQL中可以防止解析器在运行之前尝试匹配该元数据,此时就可以了,因为更改已经发生了。我不知道如何帮助它正确运行-也许有人可以帮助。