23

TABLE 変数を sp_executesql プロシージャに渡そうとしています。

 DECLARE @params NVARCHAR(MAX)
 SET @params = '@workingData TABLE ( col1 VARCHAR(20),
                col2 VARCHAR(50) )'

 EXEC sp_executesql @sql, @params, @workingData

エラーが発生します:

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'TABLE'.

「TABLE」以降のカラム指定を省略してみました。また、テーブルを動的 SQL 内の変数として宣言しようとしました。しかし、運が悪い...

このプロシージャでは、TABLE 変数をパラメータとして渡すことは許可されていないようです。ところで: MSSQL2008 R2 を実行しています。

別のプロシージャから作業データをロードするため、#workingData のようなローカル一時テーブルの使用には興味がありません。

INSERT INTO @workingData
     EXEC myProc @param1, @param2

私は一時変数に直接行うことはできません(そうですか?)...

どんな助けでも大歓迎です!

4

5 に答える 5

12

SQL Server 2008 を使用している場合、テーブル変数をストアド プロシージャに渡すには、最初にテーブル タイプを定義する必要があります。

CREATE TYPE SalesHistoryTableType AS TABLE
(                     
    [Product] [varchar](10) NULL,                
    [SaleDate] [datetime] NULL,                
    [SalePrice] [money] NULL
)
GO

または、データベースに格納されている既存のテーブル タイプを使用します。

このクエリを使用して、既存のテーブル タイプを検索します

SELECT * FROM sys.table_types

ストアド プロシージャで使用するには、入力変数をテーブルとして宣言します。

CREATE PROCEDURE usp_myproc
(
    @TableVariable SalesHistoryTableType READONLY
)
AS BEGIN
    --Do stuff     

END
GO

ストアド プロシージャに渡す前にテーブル変数を設定します。

DECLARE @DataTable AS SalesHistoryTableType
INSERT INTO @DataTable
SELECT * FROM (Some data)

ストアド プロシージャを呼び出します。

EXECUTE usp_myproc
@TableVariable = @DataTable

詳細については、こちらをご覧ください。

于 2011-01-01T17:10:32.713 に答える
3

OK、これは私が望むものを手に入れますが、確かにきれいではありません:

DECLARE @workingData TABLE ( col1 VARCHAR(20),
        col2 VARCHAR(20) )

    INSERT INTO @workingData
        EXEC myProc

    /* Unfortunately table variables are outside scope
       for the dynamic SQL later run. We copy the 
       table to a temp table. 
       The table variable is needed to extract data directly
       from the strored procedure call above...
    */
    SELECT * 
    INTO #workingData
    FROM @workingData


        DECLARE @sql NVARCHAR(MAX)
    SET @sql = 'SELECT * FROM #workingData'

    EXEC sp_executesql @sql

この一時的な結果セットを sp_executesql に渡すより良い方法があるはずです!?

よろしくアレックス

于 2010-11-24T07:58:51.773 に答える
2

これはあなたの質問に直接答えないかもしれませんが、問題全体を解決するはずです.

実際、ストアド プロシージャの実行結果を一時テーブルにキャプチャできます。

INSERT INTO #workingData
EXEC myProc 

したがって、コードを次のように変更します。

CREATE TABLE #workingData ( col1 VARCHAR(20),    
    col2 VARCHAR(20) )    

INSERT INTO #workingData    
    EXEC myProc    

DECLARE @sql NVARCHAR(MAX)    
SET @sql = 'SELECT * FROM #workingData'    

EXEC sp_executesql @sql    

よろしく、 ティム

于 2011-11-25T18:20:24.443 に答える
0
Alter PROCEDURE sp_table_getcount 
 @tblname nvarchar(50) ,
 @totalrow int output 
AS
BEGIN

Declare @params nvarchar(1000)
Declare @sql nvarchar(1000)
set @sql = N'Select @cnt= count(*) From @tbl'
set @params = N'@tbl nvarchar(50) , @cnt int OUTPUT'
Exec sp_executesql @sql , @params ,@tbl=@tblname ,  @cnt = @totalrow OUTPUT   
END
GO

オブジェクトがスコープ外であるため、上記のコードはテーブルとして機能しないことに注意してください。エラーが表示されます: テーブル変数を宣言する必要があります。回避するには、次の手順を実行します。

Alter PROCEDURE sp_table_getcount 
 @tblname nvarchar(50) ,
 @totalrow int output 
AS
BEGIN

Declare @params nvarchar(1000)
Declare @sql nvarchar(1000)
set @sql = N'Select @cnt= count(*) From dbo.' + @tblname
set @params = N'@cnt int OUTPUT'
Exec sp_executesql @sql , @params , @cnt = @totalrow OUTPUT   
END
GO
于 2012-05-16T04:32:31.003 に答える