[英]Stored procedure to drop the column in SQL Server
您不能使用參數對表名和列名進行參數化——這些只對值有效——對對象名無效。
如果這是一次性操作,最簡單的選擇是使用以下代碼在 SSMS 中生成ALTER TABLE ... DROP COLUMN ...
語句:
SELECT
'ALTER TABLE ' + SCHEMA_NAME(t.schema_id) + '.' + t.Name +
' DROP COLUMN Phone;'
FROM
sys.tables t
然后在SSMS中執行這段代碼; 它的輸出是一個語句列表,然后您可以將其復制並粘貼到新的 SSMS 窗口並執行。
如果你真的想把它作為一個存儲過程來做,你可以應用相同的基本思想 - 然后只使用代碼(游標)迭代正在生成的命令,並執行它們 - 像這樣:
CREATE PROCEDURE dbo.DropColumnFromAllTables (@ColumnName NVARCHAR(100))
AS
BEGIN
DECLARE @SchemaName sysname, @TableName sysname
-- define cursor over all tables which contain this column in question
DECLARE DropCursor CURSOR LOCAL FAST_FORWARD
FOR
SELECT
SchemaName = s.Name,
TableName = t.Name
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE
EXISTS (SELECT * FROM sys.columns c
WHERE c.object_id = t.object_id
AND c.Name = @ColumnName);
-- open cursor and start iterating over the tables found
OPEN DropCursor
FETCH NEXT FROM DropCursor INTO @SchemaName, @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Stmt NVARCHAR(1000)
-- generate the SQL statement
SET @Stmt = N'ALTER TABLE [' + @SchemaName + '].[' + @TableName + '] DROP COLUMN [' + @ColumnName + ']';
-- execute that SQL statement
EXEC sp_executeSql @Stmt
FETCH NEXT FROM DropCursor INTO @SchemaName, @TableName
END
CLOSE DropCursor
DEALLOCATE DropCursor
END
這個程序應該可以工作。
它遍歷所有列,然后刪除 sum(col) 為零的列。
備份表
alter procedure deletecolumnsifzero @tablename varchar(1000)
as
set nocount on
declare @n int
declare @sql nvarchar(1000)
declare @sum_cols nvarchar(1000)
declare @c_id nvarchar(100)
set @n = 0
declare c1 cursor for
select column_name from information_schema.columns
where
table_name like @tablename
--Cursor Starts
open c1
fetch next from c1
into @c_id
while @@fetch_status = 0
begin
set @sql=''
set @sql='select @sum_cols = sum('+@c_id+') from ['+@tablename+']'
exec sp_Executesql @sql,N'@sum_cols int out,@tablename nvarchar(100)',@sum_cols out,@tablename
if(@sum_cols = 0)
begin
set @n=@n+1
set @sql=''
set @sql= @sql+'alter table ['+@tablename+'] drop column ['+@c_id+']'
exec sp_executesql @sql
end
fetch next from c1
into @c_id
end
close c1
deallocate c1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.