使用适当的数据类型。此外,您将只能删除调用程序默认模式中的表的列。由于过程不考虑模式,因此只能传递表名,并且如果表中存在其他调用方默认模式,则无法使用此过程将其删除。
CREATE PROCEDURE DropColumn
@tableName SYSNAME,
@columnName SYSNAME
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' ALTER TABLE ' + QUOTENAME(@tableName)
+ N' DROP COLUMN ' + QUOTENAME(@columnName);
EXEC sp_executesql @SQL;
END
GO
我过来看了我的第一种方法的一些基本简单的问题,只要创建删除SQL Server中的对象经常检查,如果它们存在,以避免任何错误。一个更完整和安全的方法将是类似的...
这次我也添加架构作为参数。
ALTER PROCEDURE DropColumn
@tableName SYSNAME,
@columnName SYSNAME,
@Schema SYSNAME,
@Success BIT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' IF EXISTS (SELECT * FROM sys.tables t
INNER JOIN sys.columns c
ON t.[object_id] = c.[object_id]
INNER JOIN sys.schemas sc
ON t.[schema_id] = sc.[schema_id]
WHERE t.name = @tableName
AND c.name = @columnName
AND sc.name = @Schema)
BEGIN
ALTER TABLE ' + QUOTENAME(@Schema)+ '.' + QUOTENAME(@tableName)
+ N' DROP COLUMN ' + QUOTENAME(@columnName)
+ N' SET @Success = 1; '
+ N' END
ELSE
BEGIN
SET @Success = 0;
END '
EXEC sp_executesql @SQL
,N'@tableName SYSNAME, @columnName SYSNAME, @Schema SYSNAME, @Success BIT OUTPUT'
,@tableName
,@columnName
,@Schema
,@Success OUTPUT
END
GO
我不认为表/列名可能是一个变量。不是100%肯定 – Steve 2014-11-06 19:29:46
@Steve这就是为什么op使用动态SQL – Lamak 2014-11-06 19:30:40
你有更好的主意吗? :d任何提示? @Steve – user3671805 2014-11-06 19:32:21