在sql存储过程中传递表名

gun*_*erz 5 t-sql stored-procedures

是否可以将表名作为输入参数传递给存储过程?

例如:

create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用.那么,如果我想将表名传递给存储过程,最好的方法是什么?

非常感谢

Dan*_*haw 10

最安全的方法是通过视图.

创建一个视图,该视图将您可能希望访问的所有表(以及必须具有相同列结构的所有表)联合起来,并在行前加上表名.

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
Run Code Online (Sandbox Code Playgroud)

您的存储过程现在可以过滤表名:

CREATE PROCEDURE test
    @TableName varchar(100)
AS
    SELECT * FROM MultiTable WHERE TableName = @TableName
Run Code Online (Sandbox Code Playgroud)

这比使用动态SQL创建和执行更安全.