2017-10-04 20 views
0

私はどのテーブルをクエリするのか定義するパラメータを持つストアドプロシージャを実行したい異なるテーブル(すべて同じ構造)を持つデータベースを持っています。SQLストアドプロシージャ - パラメータとしてテーブル

私はそれを把握するように見えることはできません。

CREATE SCHEMA test; 
GO 

まず、私は私が作成し、私はその後、テーブルタイプ

USE [TestDataFiles] 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


CREATE PROCEDURE [test].[testing] 
(
    -- Add the parameters for the stored procedure here 
    @datetime datetime, 
    @t DataType READONLY 

) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON 


select top(10) * 
from @t 
where [datetime] > @datetime     

END 
GO 

を作成した後、スキーマ

CREATE TYPE DataType as TABLE (
    [datetime] [datetime] NULL, 
    [testVar] [bigint] NULL) 
    GO 

を作成しましたストアドプロシージャ。

Exec test.testing @t = 'table.1', @datetime = '2017-01-01' 

は、しかし、私は次のエラーを取得する、それを呼び出すとき:私はbeginselect間手順の例を見てきました

Exec test.testing @t = [table.1], @datetime = '2017-01-01' 

Msg 206, Level 16, State 2, Procedure test, Line 0 [Batch Start Line 0] Operand type clash: varchar is incompatible with DataType

同じで起こりますあなたは次のようなものを置く:

INSERT INTO table.1 
(datetime, testVar) 

しかし、table.1(またはテーブルのリストがあるのでtable2など)にはデータがあり、変更したくありません。

TYPEのようにダミーテーブルを作成するつもりがない限りは?

私がオンラインで見つけた例は役に立ちました。

+3

あなたはテーブル名を渡してそのテーブルをクエリしたいと思うように思えます。これは動的SQLを必要とするでしょう、私はあなたが望むものと信じています。 –

+0

私はこれの任意の例を見つけることができません、リンクや説明をいただければ幸いです。基本的には、異なるテーブル間でSQLストアドプロシージャを呼び出すRコードを記述しています。 n個のテーブルに同じSPを作成したくない – Olivia

答えて

4

のようなストアドプロシージャにそれを渡すの基本的な手順は、声明あなたを保持する文字列を構築することである

実行してから実行してください

declare @SQL nvarchar(1000) 
declare @t as nvarchar (1000) 
set @t = 'MyTable' 
set @Sql = 'Select * from ' + @t 
exec sp_executesql @sql 
1

DataTypeのパラメータを渡す必要があります。だから、あなたは、動的SQLを使用する必要がありますことを、その型の変数を作成し、実行するには

declare @table1 DataType 
INSERT INTO @table1(datetime, testVar) values (..., ...) 
Exec test.testing @datetime = '2017-01-01', @t = @table1 
+0

私のテーブルを変更するには挿入しませんか?これらのテンポラリテーブルは固定テーブルです。 – Olivia

+1

いいえ、パステーブルをパラメータとして使用する場合は、これを使用する必要があります。 – Marusyk

+0

テーブル変数をテンポラリテーブルと考えればうまくいきます。私はこれが正解であるので、質問に答えた。しかし、それはXY問題であるように思われる。 –

関連する問題