簡體   English   中英

SQL:BEGIN和END中的多個語句

[英]SQL: multiple statements within a BEGIN and END

我正在嘗試向現有表添加新列,該表將由唯一的Guid值填充。 我正在嘗試以下代碼:

IF NOT EXISTS(select * from sys.columns 
        where Name = N'Product_GUID' and Object_ID = Object_ID(N'dbo.Product'))
BEGIN
    PRINT 'Creating new GUID column in dbo.Product table'
    ALTER TABLE dbo.Product
    ADD Product_GUID uniqueidentifier  NULL

    UPDATE dbo.Product
    SET Product_Guid=NEWID()

    ALTER TABLE dbo.Product 
    ALTER COLUMN Product_Guid uniqueidentifier NOT NULL
END 

由於第二條語句無法識別新的列名,因此無法使用。 我不能放GO或; 但是在每個語句的末尾,大概是因為我在BEGIN / END塊的中間。

解決這一難題的最佳方法是什么?

似乎您想設置默認值並使列不為空。 如果僅將默認值設置為NEWID(),您將獲得相同的效果。

IF NOT EXISTS(select * from sys.columns 
        where Name = N'Product_GUID' and Object_ID = Object_ID(N'dbo.Product'))
BEGIN
    PRINT 'Creating new GUID column in dbo.Product table'
    ALTER TABLE dbo.Product
    ADD Product_GUID uniqueidentifier NOT NULL DEFAULT NEWID()
END 

如果需要在此之后刪除約束,則可以在alter語句中定義列之后創建DEFAULT約束,然后緊隨其后刪除命名約束。 如果沒有命名約束,則必須從sys.objects獲取名稱,然后執行動態sql刪除它。

IF NOT EXISTS(select * from sys.columns 
        where Name = N'Product_GUID' and Object_ID = Object_ID(N'dbo.Product'))
BEGIN
    PRINT 'Creating new GUID column in dbo.Product table'

    ALTER TABLE dbo.Product
        ADD Product_GUID uniqueidentifier NOT NULL,
            CONSTRAINT Default_Product_GUID DEFAULT NEWID() FOR Product_GUID;

    ALTER TABLE dbo.Product DROP CONSTRAINT Default_Product_GUID
END 

添加該列后,必須編譯執行更新的語句。

通常這樣做的方法是將語句包裝在EXEC

EXEC(' UPDATE dbo.Product 
       SET Product_Guid = NEWID() 

      ALTER TABLE dbo.Product 
      ALTER COLUMN Product_Guid uniqueidentifier NOT NULL
') 

您可以稍后再更新表,然后在另一個代碼塊中對其進行更改,如下所示:

IF NOT EXISTS(select * from sys.columns 
        where Name = N'Product_GUID' and Object_ID = Object_ID(N'dbo.Product'))
BEGIN
    PRINT 'Creating new GUID column in dbo.Product table'
    ALTER TABLE dbo.Product
    ADD Product_GUID uniqueidentifier  NULL
END
GO
UPDATE dbo.Product
SET Product_Guid=NEWID()
Where Product_Guid is null

if @@ROWCOUNT <> 0
Begin
    ALTER TABLE dbo.Product 
    ALTER COLUMN Product_Guid uniqueidentifier NOT NULL
End

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM