0

私はこのようなストアドプロシージャを持っています。テーブル変数(動的クエリ)を宣言する必要があります

ALTER PROCEDURE [dbo].[storedProc_dataPull] 
    @serverName nvarchar(30), 
    @dbName nvarchar(30), 
    @tblName nvarchar(30), 
    @schemaName nvarchar (30), 
    @userID nvarchar (30), 
    @password nvarchar (30), 
    @sampleTbl nvarchar (30) 
AS 
BEGIN 
    DECLARE @schemaAndTbl nvarchar (39) 

    SET @schemaAndTbl = @dbName + '.' + @schemaName + '.' [email protected] 

    EXEC('INSERT INTO @sampleTbl 
     ([ID] 
     ,[ActivityDefinitionID] 
     ,[ParentID] 
     ,[Caption] 
     ,[Description] 
     ,[ShortDescription] 
     ,[Name] 
     ,[Order] 
     ,[ReferenceNumber] 
     ,[ShowOnNavigation] 
     ,[Status] 
     ,[InUseBy] 
     ,[ExpectedStartDate] 
     ,[ActualStartDate] 
     ,[ExpectedEndDate] 

    SELECT * 
    FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 

    UPDATE @sampleTbl 
    SET ServerName = ''[email protected]+'', DBName = ''[email protected]+'' 
    WHERE ServerName IS NULL AND DBName IS NULL 
END 

私が実行しようとしている、私は常にエラーを取得:

Must declare the table variable

私の次の問題は、同様に、パラメータとして列名を渡すことです。

SQL Serverでも可能ですか?私は自分のアプリケーションのために動的ストアドプロシージャを作成したいだけです。

答えて

2

あなたは動的クエリに@sampleTblを宣言していません。

テーブル変数スコープは、実行のバッチに制限されています。 Execステートメントは、ステートメントをバッチで実行します。したがって、宣言、挿入、選択&テーブル変数の更新は、同じバッチに含まれている必要があります。これはEXEC Statementの内部を含んでいなければなりません。

2番目の質問:私の次の問題は、パラメータとして列名も渡すことです。

はい、それはsp_executesql

で可能であるが、同じのためsp_executesql (Transact-SQL)を見てください。

0

ステートメントを変更するには、 を使用するか、カスタム変数の型にテーブル変数の構造体を定義することができます。 sp_executesqlで可能です。

INSERT INTO @sampleTbl 
EXEC(' SELECT 
    ([ID] 
    ,[ActivityDefinitionID] 
    ,[ParentID] 
    ,[Caption] 
    ,[Description] 
    ,[ShortDescription] 
    ,[Name] 
    ,[Order] 
    ,[ReferenceNumber] 
    ,[ShowOnNavigation] 
    ,[Status] 
    ,[InUseBy] 
    ,[ExpectedStartDate] 
    ,[ActualStartDate] 
    ,[ExpectedEndDate] 

SELECT * FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 
1

サンプルテーブル@sampleTblは、ストアドプロシージャのパラメータです。これはタイプnvarchar (30)でもあります。これは正しくありません。なぜここでテーブルをパラメータとして渡したいのか分かりません。テーブルをパラメータとして渡す場合は、TYPEとして宣言し、テーブルをREADONLYとして渡す必要があります。そのテーブルに値を書き込むことはできません。パラメータからそれを削除し、上記の回答に記載されているようにクエリを変更します。それは動作します..

ハッピーコーディング:)

関連する問題