2016-12-20 8 views
0

私は、テーブル上のすべてのデータを選択するクエリを作成しています。クエリは、ストアドプロシージャに渡す変数のテーブルベースを選択します。SQL ServerクエリのFROM句で変数を使用する方法は?

私の例ではここにあります。 example_sp table1を実行すると、table1が選択されます。 example_table table2を使用する場合も同じですが、table2を選択する必要があります。

ALTER PROCEDURE example_sp 
    @type varchar(10), -- value will be `table1` or `table2` 
AS 
BEGIN 
    SELECT * FROM @type 
END 
+1

このようなテーブル名を渡す場合は、varchar(10)の代わりにsysnameデータ型を使用する必要があります。そして、ゴードンが以下のように投稿した例にしたがって、彼が彼の素晴らしい例のようにQUOTENAMEを使用していることを確認してください。それは大幅にSQLインジェクションのリスクを軽減するのに役立ちます。 –

答えて

2

あなたはこのようなテーブル名やカラム名などの識別子を渡し、動的SQLが必要になります。

ALTER PROCEDURE example_sp (
    @tablename varchar(10) -- value will be `table1` or `table2` 
) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = 'SELECT t.* FROM @tablename t'; 

    SET @sql = REPLACE(@sql, '@tablename', QUOTENAME(@tablename)); 

    EXEC sp_executesql @sql; 
END; 
+1

2つではなく1つのステートメントでテーブル名を使用してみませんか? –

+1

ちょうど好奇心...なぜ置き換えて、単純な連結ではない? –

+2

execute example_sp( '' '; DROP TABLE STUDENTS;') – Stavr00

0

あなたのSPは2つの結果セット、空の状態1を返却する必要があります。ちょうどあなたが単にUNION

2

ゴードンが.....

を示唆しているもののA、わずかに異なるバージョンでそれらをマージすることができ、その場合には、両方の SELECT WHERE @type = 'table1'

含む文、結果が一致を設定した場合それも良いでしょうが、置きます

ALTER PROCEDURE example_sp 
    @TableName SYSNAME --<-- Use appropriate data type for sql server objects 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Declare @Sql NVARCHAR(MAX); 

    SET @Sql = N' SELECT * FROM ' + QUOTENAME(@TableName) 

    Exec sp_executesql @Sql 
END 
関連する問題