【问题标题】:Can we do dynamic SQL in From Clause in a Select Query?我们可以在 Select Query 的 From 子句中执行动态 SQL 吗?
【发布时间】:2016-06-22 03:58:32
【问题描述】:

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 插入一个表,然后你从那里读取它,或者你为什么不让整个事情变得动态?
  • @Hybridzz 当表中的数据太大如一百万或更多记录时,是否建议使用临时表来做?

标签: sql sql-server


【解决方案1】:

为了在 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中并执行它。这绝对解决了我手头的问题。
【解决方案2】:

在 SQL Server 中,SQL 语句在数据库第一次看到它时被编译。这意味着任何可以更改正在生成的代码的东西都不能是参数。这反过来意味着您不能将参数用于...

  • 表名
  • 连接表达式
  • 列名
  • where 子句
  • 按子句排序

事实上,你可以说你或多或少地被限制在使用参数...

  • 比较中的文字值MyColumn = @Param1
  • 选择语句中的文字值SELECT @Param2
  • 插入/更新语句中的文字值SET Column = @Param3
  • Top、limit 和 fetch 子句SELECT TOP @Param4

正如其他地方提到的,解决方法是将 SQL 创建为字符串,然后将该字符串传递给 sp_executesql


深度笔记:

SQL 通常被编译成中间语言。这种中间语言可以被视为 XML。有关详细信息,请参阅“执行计划”。

在 SQL Server 2014 中,存储过程可以转换为 C++ 代码,然后编译为机器语言。这样做有很多限制,这里就不多说了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多