我们能在Select查询语句的From子句中使用动态SQL吗?

3
在from子句中的select查询可以是动态SQL吗?例如:
DECLARE @sql NVARCHAR(MAX)
SET @sql='SELECT * table'

SELECT t.*, a+b AS total_sum
FROM
(
   EXEC (@sql)
) t

如果上述方法不可行,我们如何实现此功能? 当然,如果在SQL Server中运行上述查询会导致错误。
谢谢您的帮助。

使用动态SQL将数据插入到表中,然后从表中读取数据,或者为什么不将整个过程都设为动态的呢? - Sin
@Hybridzz 当表中的数据过大,例如一百万条或更多记录时,使用临时表是否可行? - sethu
看看这个答案,可以使用SQL来过滤存储过程的结果:https://dev59.com/xXE85IYBdhLWcg3w3Xr6#28295383 ;)。 - shA.t
2个回答

4
为了在FROM子句中使用动态表,你必须在外部运行命令EXEC(@sql): 以你上面的例子为例:
DECLARE @sql NVARCHAR(MAX)

DECLARE @dynamicSql NVARCHAR(MAX)

SET @sql='SELECT * table'

SET @dynamicSql ='SELECT t.*, a+b AS total_sum
FROM
(
   '+@sql+'
) t'

EXECUTE sp_executesql @dynamicSql

所以基本上把所有东西(包括外部选择部分)放在一个动态 SQL 中并执行它。这肯定解决了我手头的问题。 - sethu

3
在SQL Server中,数据库第一次看到SQL语句时会对其进行编译。这意味着任何可以改变生成代码的东西都不能是参数。换句话说,您不能将以下内容用作参数:
- 表名 - 连接表达式 - 列名 - where子句 - order by 子句
实际上,您可以说您基本上只能使用参数来:
- 以文字方式在比较操作中使用MyColumn = @Param1 - 在select语句中使用文字值SELECT @Param2 - 在insert / update语句中使用文字值SET Column = @Param3 - 使用Top,limit和fetch子句SELECT TOP @Param4 正如其他地方提到的那样,解决方法是将您的SQL创建为字符串,然后将该字符串传递给sp_executesql
深入注释:
SQL通常会被编译成中间语言。这个中间语言可以看作是XML。有关更多信息,请参见“执行计划”。
在SQL Server 2014中,存储过程可以转换为C++代码,然后编译为机器语言。在执行此操作时有许多限制,这些限制太多无法在此处讨论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接