5

テーブル名を入力パラメーターとしてストアドプロシージャに渡すことはできますか?

例えば:

create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go

私はこれが機能しないことを知っています。では、テーブル名をストアドプロシージャに渡したい場合は、どうすればよいでしょうか。

どうもありがとう

4

3 に答える 3

11

これを行う最も安全な方法は、ビューを使用することです。

アクセスしたいすべてのテーブルを結合するビューを作成し(すべて同じ列構造である必要があります)、行の前にテーブル名を付けます。

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の作成と実行を使用するよりも安全です。

于 2012-05-24T09:20:01.833 に答える
4

動的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を作成しようとしている可能性があることです。これは、通常は悪い考えです。明らかに、私はあなたのユースケースを知りません。

于 2012-05-24T09:21:02.117 に答える
2
DECLARE @Name VARCHAR(50)
SET @Name='Company'

EXEC('SELECT * from ' + @Name )

この方法を使用して、データベースからレコードを取得します。

于 2012-05-24T09:26:35.053 に答える