Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有办法创造一个;变量";在MS SQL Server中_Sql Server - Fatal编程技术网

Sql server 有没有办法创造一个;变量";在MS SQL Server中

Sql server 有没有办法创造一个;变量";在MS SQL Server中,sql-server,Sql Server,我希望用几个脚本编写一系列查询,但是我希望用户能够输入一些变量,比如年份,然后在查询中使用这些变量作为参数。有没有一种简单的方法可以做到这一点?您可以使用declare语句: declare @month int = 7 declare @year int =2018 然后在查询中使用这些选项: ....where month=@month and year=@year 只有在脚本将在同一批中执行时,才能执行此操作。如果您的用户打算直接将这些脚本加载到SSMS中,或者使用命令行客户端(如SQ

我希望用几个脚本编写一系列查询,但是我希望用户能够输入一些变量,比如年份,然后在查询中使用这些变量作为参数。有没有一种简单的方法可以做到这一点?

您可以使用declare语句:

declare @month int = 7
declare @year int =2018
然后在查询中使用这些选项:

....where month=@month and year=@year

只有在脚本将在同一批中执行时,才能执行此操作。如果您的用户打算直接将这些脚本加载到SSMS中,或者使用命令行客户端(如SQLCMD)来执行,那么每个脚本文件都将在其自己的批处理中执行,您需要声明变量并在每个脚本文件中设置值


否则,您需要用其他语言编写程序或脚本,以提示用户输入值。您的程序需要知道如何在每个或脚本文件中设置变量值,然后对SQL Server实例执行这些值。

要明确这一点:使用
DECLARE
语句声明的变量仅在其声明的“批处理”中有效。“批处理”是SQL Server作为一个整体分析和执行的命令的“提交”。如果变量是在文件中的语句中声明的,并且如果您将文件作为一个整体执行,并且……,则这可能是一个.sql文件的全部内容注意-如果脚本未包含
转到
。这个小词
GO
不是SQL命令,但它是用于支持脚本的程序(如SSM)的命令。此命令的目的是标记“批次结束”。它告诉程序“提交”,然后开始新的批处理(开始收集语句,直到下一个
GO
或文件末尾)

在场景中使用变量的唯一方法是创建一个脚本文件,其中包含“4个或5个不同文件”中的所有命令,并删除每个
GO
(至少在变量的声明和使用之间)


如果您需要一个可跨多个批次(和文件)访问的值,则必须将该值存储在表中,并在需要访问该值的每个批次中查询该值(到变量中)。

什么样的脚本?你会把这些变量传递给你的脚本吗?我的意思是“.sql”不确定这是否是正确的术语,但我正在对4个或5个不同的“.sql”文件编写查询以进行组织。我想在其中一个上有一个变量,允许我从其余的查询调用它
从其余的查询调用它
-不,不起作用。SQL变量范围仅限于当前批处理。MSSQL中没有“全局变量”(在一般理解中)。XY问题再次出现…我尝试了这个方法并执行了“declare@year int=2017”,但出现了这个错误“必须声明标量变量“@year”。“您可以执行
declare@month int declare@year int set@month=7 set@year=2018
declare@month int=7;宣布@year int=2018年如果您收到“必须声明标量变量@year”消息,则可能您没有声明变量@year,或者您突出显示了要运行的特定代码,但没有突出显示之前的声明代码。