2014年5月10日 星期六

SQL筆記:欄位相關


使用SQL SERVER。

要刪除具有Default屬性的欄位,也就是具有相依性的欄位。
通常直接下以下指令會出現錯誤訊息

ALTER TABLE TableName DROP COLUMN TableColumn

錯誤訊息類似
資料表與xxx相依……

此時需先把相依性給刪除,執行以下指令可找出相依性。
EXEC sp_helpconstraint @objname = 'TableName'

找到後刪除
ALTER TABLE TableName DROP CONSTRAINT constraint_name 
接著就可以回到一開始把欄位給刪掉了。

---------------------------------------------------------------------------------------------------------------------

有時候要對大量TABLE進行新增欄位,可是又不確定哪些資料表有新增過。
要避免錯誤訊息跑出來嚇人,可以用以下的寫法。
IF (select count(name) from syscolumns where id=object_id('TableName') and name='ColumnsName') = 0
    BEGIN
        ALTER TABLE TableName
        --add the col u want
        ADD ColumnsName nvarchar(100) NULL DEFAULT '' 
    END

原理就是判斷資料表中有沒有這個欄位,沒有的話就新增。這麼一來就不會有錯誤訊息出現了。

---------------------------------------------------------------------------------------------------------------------

重設primary key指令碼。
ALTER TABLE TableName DROP CONSTRAINT PK_NAME
ALTER TABLE TableName ADD CONSTRAINT PK_NAME PRIMARY KEY(Col_A, Col_B, Col_C)

查過資料才發現ADD的時候加上CONSTRAINT PK_NAME可為條件約束命名。

每次建立的時候,除非命名,否則PK_NAME都會不一樣。
那如何在無法得知 PK_NAME的情況下新增呢?

利用變數及EXEC可以達到這點。


DECLARE @PKNAME nvarchar(30)

SELECT @PKNAME = name FROM SYS.objects
WHERE OBJECT_NAME(PARENT_OBJECT_ID)='TableName'
AND type_desc LIKE '%CONSTRAINT' AND type = 'PK'

EXEC( 'ALTER TABLE TableName DROP CONSTRAINT ' + @PKNAME )
ALTER TABLE TableName ADD CONSTRAINT PK_NAME PRIMARY KEY(Col_A, Col_B, Col_C)



0 comments:

張貼留言