2014-11-06 192 views
0

为什么我在尝试执行以下代码时遇到此错误? 我有一个表有两列的NewTable1:column1和column2。不正确的语法SQL

我得到这个错误:“column2”附近的语法不正确。

--DROP COLUMN PROCEDURE 

CREATE PROCEDURE DropColumn 
    @tableName varchar(50), 
    @columnName varchar(50) 
AS 

    BEGIN 
     DECLARE @SQL nvarchar(500); 
     SET @SQL = N'ALTER TABLE ' + QUOTENAME(@tableName) 
     + ' DROP COLUMN ' + QUOTENAME(@columnName); 
     EXEC sp_executesql @SQL; 
    END 
RETURN 0 
GO 

USE SKI_SHOP; 
EXEC DropColumn 'NewTable1', 'column2'; 
GO 
+0

我不认为表/列名可能是一个变量。不是100%肯定 – Steve 2014-11-06 19:29:46

+1

@Steve这就是为什么op使用动态SQL – Lamak 2014-11-06 19:30:40

+0

你有更好的主意吗? :d任何提示? @Steve – user3671805 2014-11-06 19:32:21

回答

2

使用适当的数据类型。此外,您将只能删除调用程序默认模式中的表的列。由于过程不考虑模式,因此只能传递表名,并且如果表中存在其他调用方默认模式,则无法使用此过程将其删除。

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 
+0

它的工作!非常感谢!我还在学习 – user3671805 2014-11-06 19:43:20