是否可以将表名作为输入参数传递给存储过程?
例如:
create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
我知道这不起作用。那么,如果我想将表名传递给存储过程,最好的方法是什么?
非常感谢
答案 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 )
使用这种方式从数据库中获取记录。