如果我想在FROM
SQL 查询的子句中使用变量,我需要使用动态 SQL。如果查询又长又复杂,这可能会很痛苦。
从您当前未连接到的数据库中运行查询的方法有几种。我最常用的两种方法是这些..
Select * from msdb..sysjobs_view
或者
USE MSDB
Select * from sysjobs_view
如果您从 master 数据库开始,以上两种方法都会给您相同的结果。
当我将它们都放入动态 SQL 时,一个有效,另一个无效
从大师开始,这有效
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'Select * from ' + @DBN + '..sysjobs_view'
EXEC (@Sql)
但这并不
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'USE ' + @DBN
EXEC (@Sql)
Select * from sysjobs_view
我得到错误
消息 156,级别 15,状态 1,第 14 行关键字“EXEC”附近的语法不正确。
我这样做的原因是:在大型复杂查询中使用一行动态 SQL 比尝试将整个查询转换为动态 SQL 更容易编写代码。我的问题只是关于为什么它不能与该USE
条款一起使用。
为什么我不能使用带有USE
子句的动态 SQL来更改数据库上下文?
注意:以下确实有效,并且很容易编码。但是我关于为什么的问题仍然存在。
DECLARE @DBN SYSNAME
SET @DBN = 'msdb'
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'USE ' + @DBN +'
Select * from sysjobs_view
'
EXEC (@Sql)
根据Tibor Karaszi 的评论,该更改仅适用于“EXEC 范围”,这已通过下面的 Microsoft 声明进行验证。
最简单的解决方法可能是问题中的最后一个示例。在代码的开头和结尾添加几行代码可以更改单次执行的上下文。您的其余代码保留在“执行”之前的任何上下文中
使用这种动态 SQL 解决方案有一些限制 如果您的 2GB 代码中有单引号,则必须通过加倍单引号来对其进行转义。 如果有很多代码需要审查和测试,这可能是一个巨大的痛苦。