关于.net:在SQL Server 2008的“From”子句中使用表名的变量

Using a variable for table name in 'From' clause in SQL Server 2008

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

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

我需要这样的东西:

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

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

有没有人知道如何在没有某种大规模切换声明的情况下在UDF中实现这一点?


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


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

看到这个问题:
在SQLServer 2005函数中执行动态SQL


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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'


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


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


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