gpt4 book ai didi

sql - 为什么在 SQL 中对现有列的测试失败?

转载 作者:行者123 更新时间:2023-12-04 19:15:48 27 4
gpt4 key购买 nike

我有这个 SQL 更改脚本,它作为我的南特编排数据库创建或更新的一部分运行:

SET XACT_ABORT ON
BEGIN TRANSACTION

PRINT 'Change MyColumn column to MyNewColumn column in MyTable table'
IF EXISTS (SELECT *
FROM sys.columns
WHERE Name = 'MyColumn' AND Object_id = OBJECT_ID('[dbo].[MyTable]'))
BEGIN
PRINT '-> Exists, change it'
/* NOTE THE NEXT LINE */
SET @Value = (SELECT MyColumn FROM [dbo].[MyTable])

ALTER TABLE [dbo].[MyTable]
DROP CONSTRAINT DF_MyTable_MyColumn

ALTER TABLE [dbo].[MyTable]
DROP COLUMN MyColumn

ALTER TABLE [dbo].[MyTable]
ADD MyNewColumn nvarchar(20) NULL

ALTER TABLE [dbo].[MyTable]
ADD CONSTRAINT DF_MyTable_MyNewColumn DEFAULT ('') FOR MyNewColumn

PRINT '-> Add values back into table'
SET @Dynamic_Sql = 'UPDATE [dbo].[MyTable] SET MyNewColumn = ''' + @Value + ''''
EXEC(@Dynamic_Sql)

PRINT '-> Alter to NOT NULL'
ALTER TABLE [dbo].[MyTable]
ALTER COLUMN MyNewColumn nvarchar(20) NOT NULL
END
ELSE
BEGIN
PRINT '-> Does not exist, skip it'
END

我之前已经运行过这个更新脚本并对数据库进行了更改(因此 MyColumn 不再存在)。但是现在我在这个脚本之后有了一个新脚本,但是我的“构建”在此脚本的这一行失败了:

Msg 207, Level 16, State 1, Line 15 Invalid column name 'MyColumn'

第 15 行是 FROM sys.columns 行。但这实际上是在提示我在 IF 语句中的那一行,我在其中放入了 NOTE 注释。为什么会有这种行为?当然,如果列名不存在,则该列名将无效。

最佳答案

在创建所有列后是否包括 GO 批处理分隔符?否则,在您的第一个查询运行时不会创建这些列,因为查询解析器会同时解析所有列——在解析时,该列实际上并不存在。

通过添加 GO 批处理分隔符,您可以强制它在实际创建列之后解析使用您新创建的列的查询部分。

关于sql - 为什么在 SQL 中对现有列的测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com