2014-11-06 142 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