2012-04-13 2 views
2

Я работаю над пакетом SSIS. У меня есть массив со списком имен. Эти имена будут именами таблиц.Странная проблема с созданием таблицы

Чтобы создать эти таблицы, я петля редактор SQL задачи выполнение хранимой процедуры принимающую параметр (имя таблицы)

Код для хранимой процедуры:

ALTER PROCEDURE [dbo].[TLP.CreaTable] 
(
    @TableName VARCHAR(255) 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @SQL VARCHAR(4000) 
    SET @SQL = 'IF NOT EXISTS (SELECT * 
           FROM sysobjects 
           WHERE id = OBJECT_ID(N''[dbo].' + @TableName + ''') 
           AND  xtype in (N''U'')) 
        CREATE TABLE [dbo].' + @TableName + '(
         [Serial] [int] NOT NULL, 
         [Marc] [bit] NOT NULL, 
         [Sell] [bit] NOT NULL 
) ON [PRIMARY]' 

    EXEC (@SQL) 
END 

Проблема возникает, когда один имен в массиве - это число. Я должен сказать, что все имена входят в хранимую процедуру с помощью []. Я создал точку останова перед каждым исполнением, и когда имя таблицы является числом, оно вызывает ошибку внутри SSIS (также для того, чтобы у вас была лучшая идея. Ive запускала хранимую процедуру из SQL Server Management Studio, и ошибка сохраняется, Ive использовал имя таблицы [3001], которое на самом деле является настоящим именем, вызывающим проблему).

EXEC dbo.[TLP.CreaTable] [3001] 

Msg 170, Level 15, State 1, Line 5 Line 5: Incorrect syntax near '.3001'.

Если я что-то вроде

EXEC dbo.[TLP.CreaTable] RANDOM_NAME 

Он работает просто идеально

Видимо есть какая-то ". в середине. Но я просто не могу найти его в коде.

Благодаря

EDIT:

Это был вопрос квотирования. Он работал в SQL Server Management Studio. Но когда я попробовал это в SSIS, ошибка продолжалась. Пробовал модифицировать код C#, чтобы добавить '[]' вместо просто [], и он не работал eiter.

Ошибка внутри SSIS заключается в следующем.

Error: 0xC002F210 at Create Table 030698, Execute SQL Task: Executing the query "EXEC dbo.[TLP.CreaTable] ?" failed with the following error: "An error occurred while extracting the result into a variable of type (DBTYPE_I4)". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

С точки останова Я наблюдал переменную для имени таблицы и это было нормально "[3001]

Вызывающий внутри SQL Task Editor является

EXEC dbo.[TLP.CreaTable] ? 

Но почему-то EXEC dbo.[TLP.CreaTable] '[3001]' работы в SQL Server Management Studio, но не находится в SSIS.

Любая идея? Благодарю.

EDIT 2

С Im довольно новый на форуме, я должен задать этот второй вопрос в новой «вопрос»? Поскольку вопрос, выпущенный в теме, решался. Большое спасибо.

РЕДАКТИРОВАТЬ 3

Fixed. Параметр в CREATE TABLE Редактор SQL-запросов был длинным, изменил его на varchar, и он прошел гладко. Благодаря

ответ

3

Вы можете попробовать обертывание @TableName с функцией QuoteName, которая должна бежать имя таблицы для вас. Изменить эту линию:

CREATE TABLE [dbo].' + QuoteName(@TableName) + '(

Edit: Может быть идея, чтобы обернуть имя таблицы в квадратных скобках, в случае, если это зарезервированное слово:

CREATE TABLE [dbo].[' + QuoteName(@TableName) + '] (
+0

Это был вопрос quation, но ошибка сохранялась внутри SSIS. Есть идеи? Добавлена ​​информация на главный пост. Спасибо –

2

' попробуйте использовать имя таблицы

EXEC dbo.[TLP.CreaTable] '[3001]' 
+0

Ir работал отлично! Зафиксируем теперь код C# для добавления списка массивов '' –

+0

Ошибка сохраняется в SSIS. Есть идеи? Добавлена ​​информация на главный пост. Спасибо –

2

Добавить скобки

[' + @TableName + '] 

Так что процедура магазин выглядит следующим образом:

ALTER PROCEDURE [dbo].[TLP.CreaTable] 
(
    @TableName VARCHAR(255) 
) 
AS 
BEGIN 

    SET NOCOUNT ON 

    DECLARE @SQL VARCHAR(4000) 
    SET @SQL = 'IF NOT EXISTS (SELECT * 
           FROM sysobjects 
           WHERE id = OBJECT_ID(N''[dbo].' + @TableName + ''') 
           AND  xtype in (N''U'')) 
        CREATE TABLE [dbo].[' + @TableName + '](
         [Serial] [int] NOT NULL, 
         [Marc] [bit] NOT NULL, 
         [Sell] [bit] NOT NULL 
) ON [PRIMARY]' 

    EXEC (@SQL) 
END 
+0

Да, скобки добавлены в предыдущем C# -коде. Благодаря! –

1

Вы не можете напрямую создать имя таблицы с номером. Попробуйте поместить имя таблицы в цитаты: I.e.

EXEC [dbo].[TLP.CreaTable] ['100'] 
+0

это вопрос котировок да, большое спасибо –

+0

Ошибка сохраняется в SSIS. Есть идеи? Добавлена ​​информация на главный пост. благодаря –

Смежные вопросы