是否可以将表名传递给存储过程并在没有Exec函数的情况下使用它?

时间:2009-10-22 15:11:35

标签: sql-server-2005 tsql

我想创建一个SP或UDF,我提供一个表和列名作为参数,它对该目标做了一些事情。我正在使用Sql Server 2005

琐事我正在努力实现的例子:

CREATE FUNCTION Example (@TableName AS VARCHAR(100))
RETURNS TABLE
AS
BEGIN
    SELECT * 
    INTO #temp
    FROM @TableName

    RETURN #temp
END

这个例子只是为了说明我在将表名作为参数传递方面想要完成的事情。

这是否可以不进行字符串并调用EXEC函数?

最终,我正在尝试将this question的答案转换为可重复使用的内容。

2 个答案:

答案 0 :(得分:4)

这是SQL注入的热潮。您仍然需要使用EXEC来执行此操作。

答案 1 :(得分:2)

没有。不能这样做。遗憾的是,T-SQL中没有宏预编译器。你得到的最接近的是SQLCMD模式,但这只适用于脚本,不能在对象定义中使用它。

你每次都在做同样的事情吗?

您可以动态地重新定义同义词,但这仍然需要EXEC并且您会失去并发性。您可以使用队列序列化执行,但此时您可能会更好地使用普通的旧动态SQL。

您可以尝试临时表,不作为变量传入,而是在父连接或调用过程中创建。例如

create proc #proc as
select * from #table
go

create table #table (col1 int)
insert #table values (1)
insert #table values (2)
insert #table values (3)
go

exec #proc
go

有关在存储过程之间共享数据的更多方法,请参阅此处:http://www.sommarskog.se/share_data.html