使用適當的數據類型。此外,您將只能刪除調用程序默認模式中的表的列。由於過程不考慮模式,因此只能傳遞表名,並且如果表中存在其他調用方默認模式,則無法使用此過程將其刪除。
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