Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以向多个表添加相同的约束?_Sql_Sql Server_Database_Constraints_Sp Executesql - Fatal编程技术网

Sql 是否可以向多个表添加相同的约束?

Sql 是否可以向多个表添加相同的约束?,sql,sql-server,database,constraints,sp-executesql,Sql,Sql Server,Database,Constraints,Sp Executesql,我已经在多个表中生成了一些代码来实现这一点。我执行此操作时遇到的错误是: ALTER TABLE语句中不允许使用变量 我明白。我生成的代码: DECLARE @tableName VARCHAR(50) = 'myTable', @sql NVARCHAR(100), @parameter1 CHAR(1) = 'A', @parameter2 CHAR(2) = 'I' SELECT @sql = N'ALTER TABLE '+@tableName+' ADD

我已经在多个表中生成了一些代码来实现这一点。我执行此操作时遇到的错误是:

ALTER TABLE语句中不允许使用变量

我明白。我生成的代码:

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

SELECT @sql = N'ALTER TABLE '+@tableName+'
               ADD CONSTRAINT CK_Status
               CHECK (Status in (@parameter1, @parameter2))'
EXEC sp_executesql @sql,N'@parameter1CHAR(1), @parameter2 CHAR(1)',@parameter1,@parameter2
我知道这不管用。但是我想知道在某种程度上是否可能,因为我有很多表可以应用这个

注:
-我有一个代码来获取表、名称和所有内容,我只需要一些想法来添加字符串中的字符值。

您可以添加相同的约束,但不能使用相同的名称。一个简单的方法就是省去名字。并且,将参数直接放入查询中:

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;

如果您必须在许多表中处理此约束,您可能会考虑使用一个具有“代码>状态”/“代码>的有效值的表,并使用外键约束。”< /P> < P>是的,您可以从这个例子中做到这一点。我没有测试它,但它应该工作。

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)

既然您正在将检查值硬编码到变量中,为什么不直接将它们放入exec调用中呢?如果值从未更改,则使用变量没有意义
exec sp_executesql@sql,N'A'字符1(1),'I'字符1(1)等等。
我已经考虑过了。但那不是我的问题。@sqlu的结果是:altertablemytable添加约束检查(statusin(A,I))注意CHAR值的状态。正确的方法是:altertablemytable添加约束检查(状态为('A','I'))@CarlosAndres。此查询在参数周围加上单引号。