0
私は=私はそのLENGTH
を変更するVARCHAR列にチェックし、そのdefault value
addは
テーブル= EX_EMPLOYEE
列を追加しましたTV_CODE
長さ=
私の問題:長さを変更してデフォルト値を削除し、新しい値を追加するために3ブロックを作成しました。私は1つのブロックでそれを行うことはできますか? その下の代替方法として、本当に長いコードを使用すれば、条件やコアを少なくしてより良いチェックを行うことができますか?
BEGIN
DECLARE @OLD_LENGTH numeric(4)
DECLARE @isnull numeric(4)
DECLARE @null_value varchar(10)
SELECT @OLD_LENGTH= c.length,
@isnull = c.isnullable
FROM syscolumns c
WHERE c.id = OBJECT_ID('EX_EMPLOYEE') AND c.name = 'TV_CODE'
if @isnull =1
select @null_value='NULL'
else
select @null_value='NOT NULL'
IF @@ROWCOUNT =0
begin
EXECUTE ('ALTER TABLE EX_EMPLOYEE ALTER COLUMN TV_CODE VARCHAR(11) '[email protected]_value)
end
if @OLD_LENGTH <11
EXECUTE ('ALTER TABLE EX_EMPLOYEE ALTER COLUMN TV_CODE VARCHAR(11)'+ @null_value)
END
GO
begin
DECLARE @df_value varchar(500)
select @df_value = d.name from sys.all_columns c join sys.tables t on t.object_id = c.object_id join sys.schemas s on s.schema_id = t.schema_id
join sys.default_constraints d on c.default_object_id = d.object_id
where t.name = 'EX_EMPLOYEE' and c.name = 'TV_CODE'
if @df_value is not null
begin
EXECUTE ('ALTER TABLE EX_EMPLOYEE DROP CONSTRAINT '+ @df_value)
end
end
go
IF EXISTS (SELECT 1 FROM sys.all_columns c WHERE c.object_id = OBJECT_ID('EX_EMPLOYEE')
AND c.name = 'TV_CODE')
and NOT EXISTS(select * from sys.all_columns c join sys.tables t on t.object_id = c.object_id join sys.schemas s on s.schema_id = t.schema_id
join sys.default_constraints d on c.default_object_id = d.object_id
where t.name = 'EX_EMPLOYEE' and c.name = 'TV_CODE')
BEGIN
EXECUTE ('ALTER TABLE EX_EMPLOYEE ADD DEFAULT ''A'' for TV_CODE')
END
GO
私はいくつかの質問があります、あなたはチェックを追加したデフォルト値ですか?列にデフォルト値が存在しない場合は、エラーが発生しますか? – Moudiz
デフォルトの制約を追加しても、既存のデータには影響しません。これには 'update'ステートメントが必要です。 –
2番目のセクションでは、ドロップ制約がある場合はドロップ制約文を作成します。ドロップする制約がない場合、何もしません。このようにして、「制約を作成する」セクションに入ると、その列が作成を妨げる制約はありません。 –