2015-09-25 91 views
0

我已經生成了一些代碼在多個表中執行此操作。錯誤我這樣做是:是否可以爲多個表添加相同的約束?

變量不允許在ALTER TABLE語句。

我明白這一點。我生成的代碼:

DECLARE 
@tableName VARCHAR(50) = 'myTable', 
@sql NVARCHAR(100), 
@parameter1 CHAR(1) = 'A', 
@parameter2 CHAR(2) = 'I' 

SELECT @sql = N'ALTER TABLE '[email protected]+' 
       ADD CONSTRAINT CK_Status 
       CHECK (Status in (@parameter1, @parameter2))' 
EXEC sp_executesql @sql,N'@parameter1CHAR(1), @parameter2 CHAR(1)',@parameter1,@parameter2 

我知道這行不通。但是,我希望如果有可能以某種方式,因爲我有很多表來應用這個。

注意: - 我有一個代碼來獲取表和名稱以及所有東西,我只需要一些想法在字符串中添加char值。

+0

考慮到您將檢查值硬編碼到變量中,爲什麼不直接將它們直接放入exec調用?如果值永不改變,則不需要使用變量。 'exec sp_executesql @sql,N'''char1(1),'I'char(1)etc ...' –

回答

0

您可以添加相同的約束,但不能使用相同的名稱。一個簡單的方法就是把名字留下。而且,直接把參數查詢:

DECLARE 
    @tableName VARCHAR(50) = 'myTable', 
    @sql NVARCHAR(100), 
    @parameter1 CHAR(1) = 'A', 
    @parameter2 CHAR(2) = 'I'; 

SELECT @sql = N'ALTER TABLE @tableName 
       ADD CONSTRAINT CHECK (Status in (''@parameter1'', ''@parameter2''))'; 

SET @sql = REPLACE(@sql, '@tableName', @tableName); 
SET @sql = REPLACE(@sql, '@parameter1', @parameter1); 
SET @sql = REPLACE(@sql, '@parameter2', @parameter2); 

EXEC sp_executesql @sql; 

如果你有對付這種約束在很多表,你可能會考慮與的status有效值的表,並使用外鍵約束來代替。

+0

我已經考慮過了。但那不是我的問題。將@sql放在那裏的結果是: ALTER TABLE myTable ADD CONSTRAINT CHECK(Status(in(A,I)) 請注意CHAR值的狀態。 正確的是: ALTER TABLE myTable ADD CONSTRAINT CHECK(Status(in'(','I')) –

+0

@CarlosAndres。 。 。該查詢將單引號放在參數中。 –

0

是的,你可以從這個例子中做到這一點,我沒有測試它,但它應該工作。

ALTER TABLE first_Table 
Add Constraint first_Table_FK1 FOREIGN KEY (table1_id) 
References second_Table (table2_id), 
Add Constraint first_Table_UQ1 Unique (table1_id) 
相關問題