【问题标题】:using script in a variable在变量中使用脚本
【发布时间】:2017-10-26 18:42:12
【问题描述】:

您能否声明一个变量,将其设置为脚本定义,然后在整个脚本中重复执行它?我了解如何将变量设置为脚本的结果,但我想重新使用定义本身。这是因为我想偶尔从脚本中获取计数,有时在我的脚本的其余部分中获取最高结果,并且我希望通过只需要在开始时更改一次脚本来轻松自定义脚本。

一个例子:

declare @RepeatScript nvarchar(200)

declare @count int

declare @topresult int

set @RepeatScript = ' from Table1 where something = 1 and something else > getdate()-5'

set @count = select count(ID) & @RepeatScript

set @topresult = select top 1 (ID) & @RepeatScript

这个非常简单的情况很容易解决,但如果我想多次引用同一组信息而不必一遍又一遍地创建和删除 temp_table,这将非常有帮助。我一直在 MS Access 中做这种事情,但我似乎无法弄清楚如何在 SSMS 中做到这一点。

【问题讨论】:

  • 简单地说不,你不能这样做。但是,如果您想多次访问同一查询的结果,您应该将结果存储在一个变量中,而不是一遍又一遍地执行相同的查询。要完成像您演示的那样需要动态 sql。

标签: sql-server declare


【解决方案1】:

您无需重复运行这些查询。您甚至不需要运行超过 1 个查询来捕获此信息。这将在单个查询中捕获两条数据。然后,您可以在当前批次中的任何其他位置引用该信息。这符合您在开始时简单地更改脚本的标准。

declare @count int
    , @topresult int

select @count = count(ID)
    , @topresult = MAX(ID) --MAX would the same thing as top 1 order by ID desc
from Table1 
where something = 1 

【讨论】:

  • 我不知道你可以这样写,并且在这种方法中引用变量确实让生活更轻松。在我的情况下,我仍然需要重复,因为我希望 topresult 在我运行更新语句之前并且计数在更新之后(它对语句有影响)。不过,这对我的大部分脚本都非常有帮助。
【解决方案2】:
declare @RepeatScript nvarchar(200)

declare @count varchar(200)

declare @topresult varchar(200)

set @RepeatScript = ' from Table1 where something = 1 and something else > getdate()-5'

set @count = 'select count(ID) '+@RepeatScript+''

set @topresult = 'select top 1 (ID)'+@RepeatScript+''

print (@count)
print (@topresult)

类似的东西?但您将使用 exec 来运行 select 语句,而不是使用 print。这有帮助吗?

【讨论】:

  • 如果执行,这会得到我想要的信息,但如果我想在脚本中引用它,它就不起作用。如果我想使用“Select * from table2 where ID = @topresult”,它似乎不起作用。总体思路是能够将 select 语句重复嵌套到其他语句中。
猜你喜欢
  • 2021-11-04
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2023-03-30
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多