2014-02-24 55 views
1

我创建了一个在运行时创建表的存储过程。此动态表的表列和它们的数据类型来自数据库中已存在的另一个表。显示语法错误的SQL Server存储过程

我从C#控制台应用程序代码调用此存储过程。存储过程抛出一个语法错误,我完全无法弄清楚是什么导致了这个语法错误。

这是存储过程的代码,我已经写了:

CREATE procedure [dbo].[sproc_TableExists] 
    @TableName NVARCHAR(128) 
     ,@Column1Name NVARCHAR(32) 
     ,@Column1DataType NVARCHAR(32) 
     ,@Column1Nullable NVARCHAR(32) 
AS 
    DECLARE @SQLString NVARCHAR(MAX) 
    BEGIN 
     IF(EXISTS (select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName)) 
     BEGIN 
      SET @SQLString = 'ALTER TABLE ' + @TableName + '('+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')' 
      EXEC (@SQLString) 
     END 
    ELSE 
     BEGIN 
      SET @SQLString = 'CREATE TABLE ' + @TableName + '('+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')' 
      EXEC (@SQLString) 
     END 
END 
GO 

错误我正在从代码中调用它。

附近有语法错误('

回答

2

问题在于下面的行的代码,改变现有的表时:

SET @SQLString = 'ALTER TABLE ' + @TableName + '('+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')' 

这产生如下的输出(作为一个例子使用的是假表\列名):

ALTER TABLE TableEx(ColumnEx NVARCHAR(MAX) NULL) 

但是,这不是有效的SQL语句。

如果你想要的行为是添加在表已经存在一个新的列,而不是使用:

SET @SQLString = 'ALTER TABLE ' + @TableName + ' ADD '+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable 

将产生输出:

ALTER TABLE TableEx ADD ColumnEx NVARCHAR(MAX) NULL 

请注意,如果您的意图是更改预先存在的表中预先存在的列的名称,您将需要单独测试 - 上述内容仅向现有表中添加新列。

+0

感谢您的回复@Martin。它解决了它。我在做什么愚蠢的SQL错误。再次感谢。 – Abhi

1

替换 EXEC (@SQLString)

EXEC @SQLString

+0

这导致产生另一个错误'无法找到存储过程'ALTER TABLE TableEx ADD ColumnEx NVARCHAR(MAX)NULL'。' –

+0

谢谢@Aishvarya。但是,这条线从来没有出现过问题,因为我测试了运行** CREATE **语句,并且与_EXEC_线分开工作,这绝对没问题。 – Abhi