如果 T-SQL 变量已经存在,如何重新声明它?

Joh*_*tby 6 sql-server t-sql c#

背景:

我正在构建一个要在服务器上执行的 SQL 命令,该命令涉及大量访问存储过程和声明用作其他存储过程输入的变量。这都是在客户端使用 C# 生成的,并作为一个大包发送。我必须这样做,因为 ping 时间很长,因为客户端将位于非常远程且连接不良的地方,而且我不想发送很多包并由于响应时间长而开始建立积压。

目前最多三个客户端可以并行工作,或者他们开始​​建立积压,因为一个大约 200 个存储过程的事务的传输速度需要大约 35 秒。

题:

如果它已经存在,我如何声明一个我现在没有的变量?我可以在 C# 端使用字典,但这对我来说听起来像是错误的方法。我想要一个声明,如果它确实存在,它接受重新声明该变量。

Sol*_*zky 8

你不能重新声明变量,也不能测试它们是否已经被声明(至少不是我曾经能够找到的)。但是,无论如何您都不需要这样做。如果您提前知道变量名称,只需在流程开始时将它们全部声明即可。然后,在整个脚本中使用它们。

例如:

--------------------------------
-- BEGIN script header
--------------------------------
DECLARE @SomeVariable1 INT,
        @SomeVariable2 VARCHAR(50),
        ....;
        SomeVariableN DATETIME;
--------------------------------
-- END script header
--------------------------------
Run Code Online (Sandbox Code Playgroud)

然后添加 1 个或多个使用这些变量的脚本块:

---- Script Block 1 ---
EXEC dbo.MyProc @InputParam = 1, @OutputParam = @SomeVariable1 OUTPUT;
-----------------------

---- Script Block 2 ---
EXEC dbo.AnotherProc @InputParam = @SomeVariable1;
-----------------------

---- Script Block 3 ---
SET @SomeVariable2 = NULL; -- reset value if you don't want to carry over prior value
..do something here...
-----------------------
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 5

通过阅读您的问题,我认为您正在应用程序中构建 SQL 代码,然后将其作为一个包含多个语句的长脚本发送到服务器。

如果是这种情况,您可以使用 GO 分隔您的语句以创建批次。以下是有效的 SQL:

DECLARE @a INT;
SET @a = 1;
SELECT @a;
GO

DECLARE @a INT;
SET @a = 1;
SELECT @a; 
Run Code Online (Sandbox Code Playgroud)

问题是语句不能再引用在单独批次中声明的变量。

我认为真正的答案是使用您的应用程序调用的存储过程。这减少了通过坏链接发送的数据量,并确保 SQL 有效。

  • GO 被客户端工具(解析和拆分成批处理)而不是 SQL Server 本身理解。 (10认同)
  • 为了强调@Martin 所说的内容,请尝试将该代码放入存储过程、来自应用程序的单个 SQL 批处理或通过对 `sp_executesql` 的单个调用调用的动态 SQL。它似乎只对您有用,因为 Management Studio 已将其转换为两个单独的批次;OP 没有那么奢侈。 (2认同)