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

この問題は、配列内の名前の1つが数値である場合に発生します。すべての名前が[]を使用してストアドプロシージャに入ると言わなければなりません。各実行の前にブレークポイントを作成しました。テーブル名が数値の場合、SSIS内でエラーが発生します(また、SQL Server Management Studioからストアドプロシージャを実行した方がよいでしょう。エラーが続く場合は、私はテーブル名[3001]を使用しましたが、これは実際には問題の原因となっている実際の名前です)。

EXEC dbo.[TLP.CreaTable] [3001]

メッセージ170、レベル15、状態1、5行目5行目:「。3001」付近の構文が正しくありません。

私が何かをするなら

EXEC dbo.[TLP.CreaTable] RANDOM_NAME

それは完璧に動作します

どうやらいくつかの「。」があります。途中で。しかし、私はそれをコードで見つけることができません。

ありがとう

編集

それは引用の問題でした。SQL ServerManagementStudioで機能しました。しかし、SSISで試してみると、エラーが解決しませんでした。[]だけでなく「[]」を追加するようにC#コードを変更しようとしましたが、それでも機能しませんでした。

SSIS内のエラーは次のとおりです。

エラー:0xC002F210、テーブル030698の作成、SQLタスクの実行:クエリ「EXECdbo。[TLP.CreaTable]?」を実行しています 次のエラーで失敗しました:「結果をタイプ(DBTYPE_I4)の変数に抽出中にエラーが発生しました」。考えられる失敗の理由:クエリの問題、「ResultSet」プロパティが正しく設定されていない、パラメータが正しく設定されていない、または接続が正しく確立されていない。

ブレークポイントを使用して、テーブル名の変数を監視しましたが、問題ありませんでした'[3001]'

SQLタスクエディタ内の呼び出しは

EXEC dbo.[TLP.CreaTable] ?

しかし、どういうわけかEXEC dbo.[TLP.CreaTable] '[3001]'SQL Server Management Studioで機能しますが、SSISの内部では機能しません。

何か案が?ありがとう。

編集2

私はフォーラムにかなり慣れていないので、新しい「質問」でこの2番目の質問をする必要がありますか?主題で発行された問題が解決されたので。どうもありがとう。

編集3

修理済み。CREATE TABLE SQLタスクエディターのパラメーターが長く、varcharに変更され、スムーズになりました。ありがとう

4

4 に答える 4

3

@TableNameテーブル名をエスケープするQuoteName関数でラッピングしてみてください。その行を次のように変更します。

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

編集:予約語の場合は、テーブル名を角かっこで囲むことも考えられます。

CREATE TABLE [dbo].[' + QuoteName(@TableName) + '] (
于 2012-04-13T12:04:45.877 に答える
2

'テーブル名の周りを使用してみてください

EXEC dbo.[TLP.CreaTable] '[3001]'
于 2012-04-13T12:04:35.067 に答える
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
于 2012-04-13T12:05:40.297 に答える
1

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

EXEC [dbo].[TLP.CreaTable] ['100']
于 2012-04-13T12:06:25.580 に答える