在sql存储过程中传递表名

时间:2012-05-24 09:13:29

标签: tsql stored-procedures

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

例如:

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

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

非常感谢

3 个答案:

答案 0 :(得分: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

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

CREATE PROCEDURE test
    @TableName varchar(100)
AS
    SELECT * FROM MultiTable WHERE TableName = @TableName

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

答案 1 :(得分:3)

你需要使用动态SQL,但你需要知道你打开自己的潜在SQL注入风险,好像@tablename包含了一些狡猾的东西,你可能会陷入痛苦的世界。

e.g。

-- 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)

您需要非常小心这种方法,确保不要打开一堆安全蠕虫。

我的另一个担心是你可能正在尝试制作通用数据访问sprocs,这通常是一个坏主意。显然我不知道你的用例。

答案 2 :(得分:2)

DECLARE @Name VARCHAR(50)
SET @Name='Company'

EXEC('SELECT * from ' + @Name )

使用这种方式从数据库中获取记录。