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
一時変数に直接入れることはできません(右?)...
助けてくれてありがとう!
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
さらなる議論 ここ 。
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に渡すより良い方法があるはずです!?
アレックスよろしく
これは直接あなたの質問に答えないかもしれませんが、それはあなたの問題を全体的に解決するはずです。
ストアドプロシージャの実行結果を一時テーブルに取り込むことができます。
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
よろしく、ティム
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