以下是我的代碼
IF NOT EXISTS (SELECT 1 FROM sys.objects o INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE
o.name = 'portfolioAttributeCodes'
AND c.name = 'isDisplayed'
)
BEGIN
ALTER TABLE
[cosmos].[portfolioAttributeCodes]
ADD
[isDisplayed] bit DEFAULT 1;
END
IF EXISTS (SELECT 1 FROM sys.objects o INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE
o.name = 'portfolioAttributeCodes'
AND c.name = 'isDisplayed')
BEGIN
UPDATE [cosmos].[portfolioAttributeCodes] SET [isDisplayed] = 1;
END
現在發生的事情是它不會創建一個列(跳過第一個 Id 陳述句并進入第二個并失敗 Invalid column name 'isDisplayed'
有人可以幫忙嗎?
uj5u.com熱心網友回復:
如果表中沒有列isDisplayed,整個批處理將失敗,因為決議器將生成無效的列名錯誤。這發生在任何 SQL 運行之前,因此并不是IF正在輸入第二個SQL ,根本沒有運行任何SQL。這實際上是一個編譯錯誤(例如,當您嘗試構建 C# 應用程式并且您參考了尚未定義的物件時)。
您不能在創建的同一范圍內參考新列。您需要使用 2 個批次或將對該列的參考放在單獨的范圍內,以便推遲其驗證。
延遲驗證在這里似乎沒問題:
IF NOT EXISTS (SELECT 1
FROM sys.objects o
INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE o.name = 'portfolioAttributeCodes'
AND c.name = 'isDisplayed')
BEGIN
ALTER TABLE [cosmos].[portfolioAttributeCodes]
ADD [isDisplayed] bit CONSTRAINT DF_isDisplayed DEFAULT 1 WITH VALUES;
END;
ELSE
BEGIN
EXEC sys.sp_executesql N'UPDATE [cosmos].[portfolioAttributeCodes] SET [isDisplayed] = 1;';
END;
我也切換到 an,ELSE因為在您創建它之后更新該列幾乎沒有什么意義;只需首先創建具有值的列。我的名字DEFAULT CONSTRAINT以及那只是好習慣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379310.html
標籤:sql sql-server 查询语句 数据库
