在SQL Server 2008的“From”子句中使用表名称的变量

时间:2009-06-12 19:32:05

标签: .net sql sql-server tsql

我有一个从表中查询数据的UDF。但是,该表需要作为参数定义。例如我不能:

选择*来自[dbo]。[TableA]

我需要类似的东西:

选择*来自[dbo]。[@ TableName]

以上行不起作用,UDF也禁止我将查询设置为字符串并调用exec()。我可以在一个过程中执行此操作,但我也无法从UDF调用该过程。

有没有人知道如何在没有某种大规模切换声明的情况下在UDF中完成此任务?

6 个答案:

答案 0 :(得分:21)

SET @SQL = 'SELECT * FROM ' + @table
EXEC (@SQL)  -- parentheses are required

答案 1 :(得分:7)

这是不可能的,函数不支持动态SQL。

看到这个问题: Executing dynamic SQL in a SQLServer 2005 function

答案 2 :(得分:5)

您可以UNION所有表并将表名作为列包含在内,然后将表名指定为谓词。如果您检查此示例的查询计划,则会看到未触及t2

create table t1 (i int)
create table t2 (i int)

insert t1 values(1)
insert t1 values(2)
insert t1 values(3)
insert t2 values(4)
insert t2 values(5)
insert t2 values(6)


;with tableSet as (
    select i, 't1' as tableName from t1
    union all select i, 't2' as tableName from t2
)
select i from tableSet where tableName = 't1'

答案 3 :(得分:3)

你可以写一个可以做动态sql的udf clr。我以前必须实现这个。这很漂亮。

答案 4 :(得分:0)

你不能这样做。您解决了什么问题,可能还有其他解决方案。

答案 5 :(得分:0)

如果您想提供有关您尝试解决的潜在问题的更多详细信息,我们可能会有更好的答案。一种解决方案是代码生成基于每个表的UDF。另一种方法是使用SP中的动态SQL。什么是适合你的情况很难说。