2012-04-13 12 views
2

私はSSISパッケージで作業しています。私は名前のリストを持つ配列を持っています。これらの名前はテーブル名になります。これらのテーブルを作成するには作成テーブルの奇妙な問題

、Iループのパラメータを受け入れるストアドプロシージャを実行する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 

とき1つの問題は来ます配列内の名前の番号は数字です。私はすべての名前が[]でストアドプロシージャに入ると言う必要があります。私は各実行の前にブレークポイントを作成しました。テーブル名が数字の場合、SSIS内でエラーが発生します(また、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内のエラーは次のとおりです。私は、テーブル名に変数を見て、それがOKだったブレークポイントで

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タスクエディタ内の通話が

EXEC dbo.[TLP.CreaTable] ? 

しかし、どういうわけかEXEC dbo.[TLP.CreaTable] '[3001]'作品ですSQL Server Management Studioでは使用できますが、SSISでは使用できません。

ありがとう。

EDITフォーラムにはかなり新しいイム以来2

、私は新しい「質問」でこの第二の質問をする必要がありますか?被験者の問題は解決されて以来。 ありがとうございました。

EDIT固定3

。 CREATE TABLEのSQLタスクエディタのパラメータが長く、varcharに変更されて滑らかになりました。 おかげ

答えて

3

あなたはあなたのためのテーブル名をエスケープする必要がありQUOTENAME機能を@TableNameを包む試みることができるテーブル名の周り'を使用してみてください。

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

編集:にその行を変更しても、場合には、それは予約語ですが、角括弧内のテーブル名をラップするかもしれません:

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

それはquationの問題でしたが、エラーはSSISの中に残っていました。何か案が?メインポストにいくつかの情報を追加しました。 Thanks –

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

数値を直接使用してテーブル名を作成することはできません。テーブル名を引用符で囲んでみてください。

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

これは引用の問題でした。ありがとうございました –

+0

エラーはSSIS内で持続されました。何か案が?メインポストにいくつかの情報を追加しました。ありがとう –