2015-09-25 88 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) 
相关问题