テーブル名を入力パラメーターとしてストアドプロシージャに渡すことはできますか?
例えば:
create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
私はこれが機能しないことを知っています。では、テーブル名をストアドプロシージャに渡したい場合は、どうすればよいでしょうか。
どうもありがとう
テーブル名を入力パラメーターとしてストアドプロシージャに渡すことはできますか?
例えば:
create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
私はこれが機能しないことを知っています。では、テーブル名をストアドプロシージャに渡したい場合は、どうすればよいでしょうか。
どうもありがとう
これを行う最も安全な方法は、ビューを使用することです。
アクセスしたいすべてのテーブルを結合するビューを作成し(すべて同じ列構造である必要があります)、行の前にテーブル名を付けます。
CREATE VIEW MultiTable
AS
SELECT 'table1' AS TableName, * FROM table1
UNION ALL
SELECT 'table2' AS TableName, * FROM table2
UNION ALL
SELECT 'table3' AS TableName, * FROM table3
これで、ストアドプロシージャはテーブル名でフィルタリングできます。
CREATE PROCEDURE test
@TableName varchar(100)
AS
SELECT * FROM MultiTable WHERE TableName = @TableName
これは、動的SQLの作成と実行を使用するよりも安全です。
動的SQLを使用する必要がありますが、@ tablenameに危険なものが含まれているかのように、SQLインジェクションの潜在的なリスクに注意する必要があります。これにより、苦痛の世界に陥る可能性があります。
例えば
-- basic check to see if a table with this name exists
IF NOT EXISTS(SELECT * FROM sys.tables WHERE name = @tablename)
RETURN
DECLARE @sql NVARCHAR(100)
SET @sql = 'SELECT * FROM ' + QUOTENAME(@tablename)
EXECUTE(@sql)
このアプローチには細心の注意を払う必要があります。セキュリティワームの缶を開けないように注意してください。
私の他の懸念は、一般的なデータアクセスsprocを作成しようとしている可能性があることです。これは、通常は悪い考えです。明らかに、私はあなたのユースケースを知りません。
DECLARE @Name VARCHAR(50)
SET @Name='Company'
EXEC('SELECT * from ' + @Name )
この方法を使用して、データベースからレコードを取得します。