簡體   English   中英

在 SQL Server 中刪除列的存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM