2014-02-24 4 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