ストアドプロシージャにテーブル名を渡す方法


  1. SQL Serverの場合(T-SQLを使用する場合):
CREATE PROCEDURE GetTableData
    @TableName NVARCHAR(128)
AS
BEGIN
    DECLARE @SqlStatement NVARCHAR(MAX)
    SET @SqlStatement = N'SELECT * FROM ' + QUOTENAME(@TableName)
    EXEC sp_executesql @SqlStatement
END

この例では、@TableName パラメータを使用して、動的SQL文を構築しています。QUOTENAME 関数を使用して、テーブル名をエスケープしてセキュリティを向上させています。

  1. MySQLの場合(ストアドプロシージャ内でプリペアドステートメントを使用する場合):
DELIMITER //
CREATE PROCEDURE GetTableData(IN TableName VARCHAR(128))
BEGIN
    SET @SqlStatement = CONCAT('SELECT * FROM ', TableName);
    PREPARE stmt FROM @SqlStatement;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

この例では、CONCAT 関数を使用して動的SQL文を構築し、PREPARE ステートメントを使用してプリペアドステートメントを作成しています。

  1. PostgreSQLの場合(PL/pgSQLを使用する場合):
CREATE OR REPLACE FUNCTION GetTableData(TableName VARCHAR(128))
  RETURNS TABLE (...)  -- 返すカラムを指定します
  LANGUAGE plpgsql
AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT * FROM %I', TableName);
END $$;

この例では、EXECUTE 文を使用して動的SQL文を実行しています。format 関数を使用して、テーブル名をエスケープしています。

これらの例では、指定されたテーブル名を使用して動的SQL文を実行する方法を示しています。ただし、動的SQLはセキュリティ上の懸念がありますので、テーブル名の入力値を適切に検証およびエスケープすることが重要です。また、データベースの種類によっては、さらなる制約やベストプラクティスが存在する場合がありますので、公式のドキュメントやリファレンスを参照することをおすすめします。