2016-05-27 13 views
1

いくつかの行と列を持つ2つのテーブルを作成しています。テーブル名を動的に取得して結果を生成するストアドプロシージャを作成しました。SQL Server 2012のストアドプロシージャでテーブル名を動的に与える方法

しかし、私はテーブル名を動的にパースすると、うまくいきません。ここ

CREATE PROC spGetAll (@tableName varchar(50)) 
AS 
BEGIN 
    SELECT 
     * 
    FROM @tableName 
END 

enter image description here

+0

「それでは」とはどういう意味ですか? –

+1

オブジェクト識別子に変数を使用することはできません。クエリを動的に構築し、 'sp_executesql'を介してそれを実行する必要があります。いくつかの研究を行うには、これを達成するためにSOのソリューションのshitloadがあります。 – Pred

+1

一般的に、複数のテーブルを同じように扱いたい場合は、データモデルが壊れているという兆候です。同じ「タイプ」のデータが含まれている場合、そのデータを*単一テーブルに格納する必要があります。現在無視されている(またはメタデータとしてのみモデル化されている)*データ*を格納する追加の列は、データを格納するテーブルを決定します。 'MaleEmployees'と' FemaleEmployees'を別々のテーブルとしてモデル化しません。 –

答えて

2

動的SQLを使用してください。例:

CREATE PROC spGetAll (
    @tableName SYSNAME) 
AS 
BEGIN 
    DECLARE @sql nvarchar(max) 

    IF EXISTS (SELECT name FROM sys.objects WHERE name = @tableName) 
    SET @sql = 'SELECT * FROM test.'+ QUOTENAME(@tableName) 
    EXEC(@sql) -- Or EXEC sp_executesql @sql 
END 
+1

テーブル名(タイプ識別子のシステムビューで使用されるタイプエイリアス)に 'SYSNAME'を使用します。 'EXEC'を使わず、代わりに' sp_executesql'を使います。また、 'QUOTENAME(@テーブル名)'コールは害を与えません。 – Pred

+0

それはうまく動作します - 実績 –

+0

@Pred良いキャッチ、ありがとう、私は答えにそれを置く! – gofr1

1

一つの方法です。 。

IF @tableName = 't111' 
    SELECT * FROM t111 
ELSE 
    SELECT * FROM t222