我正在尝试使用 T-SQL 从不同的表中删除不同的列。
我按照我在 SO 上找到的一些提示制作了这段代码
/* Declaration of variable */
declare @tablename nvarchar(200)
declare @colname nvarchar(200)
declare @default sysname, @sql nvarchar(max)
/* **** Modifications in TITULORECEBERFATURA_ITEMS**** */
/* Drop column NRSEQORDEM */
set @tablename = 'TITULORECEBERFATURA_ITEMS'
set @colname = 'NRSEQORDEM'
select @default = CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE
TABLE_NAME = @tablename
AND COLUMN_NAME = @colname
set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql
上面的代码没有任何问题。但是当我在它下面添加其他代码时,会发生错误。
/* Declaration of variable */
declare @tablename nvarchar(200)
declare @colname nvarchar(200)
declare @default sysname, @sql nvarchar(max)
/* **** Modifications in TITULORECEBERFATURA_ITEMS**** */
/* Drop column NRSEQORDEM */
set @tablename = 'TITULORECEBERFATURA_ITEMS'
set @colname = 'NRSEQORDEM
select @default = CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE
TABLE_NAME = @tablename
AND COLUMN_NAME = @colname
set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql
/* **** Modifications in EMAILCONTAS **** */
/* Drop column NRSEQOPERADORA */
set @tablename = 'EMAILCONTAS'
set @colname = 'NRSEQOPERADORA'
select @default = CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE
TABLE_NAME = @tablename
AND COLUMN_NAME = @colname
set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql
和他的NRSEQORDEM
约束被删除没有问题,但是我在NRSEQOPERADORA
和他的约束列中遇到了这个错误
消息 5074,级别 16,状态 1,第 1 行
对象“FK_ EMAILCONT _NRSEQ__25276EE5”依赖于列“NRSEQOPERADORA”。
消息 4922,级别 16,状态 9,第 1 行
ALTER TABLE DROP COLUMN NRSEQOPERADORA 失败,因为一个或多个对象访问此列。
并且列NRSEQOPERADORA
不会下降。
如果我为每个声明使用不同的名称,我可以做到(但不仅有 2 个,而且有很多,而且做得不好,我正在寻找一种“正确”的方式来做到这一点)
/* Declaration of variable */
declare @tablename nvarchar(200)
declare @colname nvarchar(200)
declare @tablename2 nvarchar(200)
declare @colname2 nvarchar(200)
declare @default sysname, @sql nvarchar(max)
/* **** Modifications in TITULORECEBERFATURA_ITEMS**** */
/* Drop column NRSEQORDEM */
set @tablename = 'TITULORECEBERFATURA_ITEMS'
set @colname = 'NRSEQORDEM
select @default = CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE
TABLE_NAME = @tablename
AND COLUMN_NAME = @colname
set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql
/* **** Modifications in EMAILCONTAS **** */
/* Drop column NRSEQOPERADORA */
set @tablename2 = 'EMAILCONTAS'
set @colname2 = 'NRSEQOPERADORA'
select @default = CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE
TABLE_NAME = @tablename2
AND COLUMN_NAME = @colname2
set @sql = N'alter table ' + @tablename2 + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename2 + ' drop column ' + @colname2
exec sp_executesql @sql
编辑:
- 代码有效约束被删除,列被删除。(见第一个代码示例)
- 如果我放置一个跟随脚本,使用一组不同的表和列但使用相同的声明名称(@tablename、@colname、@default),代码的第一部分将删除约束和列而没有任何问题,但是第二个脚本将显示一条错误消息(请参阅错误引用和第二个代码示例)
- 我需要能够同时做不止一次。我不能一次运行一个查询,我正在编写一个脚本来一次执行它们。但是声明部分让事情变得更难了。如果我为每个查询使用不同的声明,它会起作用;但我认为这不是正确的做法。这就是为什么我想知道,我怎么能做到这一点?还是除了变通方法没有别的办法?