SQL:BEGIN和END中的多个语句

时间:2015-03-03 15:53:41

标签: sql sql-server tsql

我尝试将新列添加到现有表格中,该表格将由唯一的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区块的中间。

解决这种困境的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您似乎想要设置默认值并使列不为空。如果您只将默认值设置为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 

答案 1 :(得分:2)

在添加列之后,必须编译执行更新的语句。

通常这样做的方法是将语句包装在EXEC

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

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

答案 2 :(得分:1)

您可以稍后更新表,然后在另一个代码块中更改它,有点像这样:

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