Joh*_*tby 6 sql-server t-sql c#
背景:
我正在构建一个要在服务器上执行的 SQL 命令,该命令涉及大量访问存储过程和声明用作其他存储过程输入的变量。这都是在客户端使用 C# 生成的,并作为一个大包发送。我必须这样做,因为 ping 时间很长,因为客户端将位于非常远程且连接不良的地方,而且我不想发送很多包并由于响应时间长而开始建立积压。
目前最多三个客户端可以并行工作,或者他们开始建立积压,因为一个大约 200 个存储过程的事务的传输速度需要大约 35 秒。
题:
如果它已经存在,我如何声明一个我现在没有的变量?我可以在 C# 端使用字典,但这对我来说听起来像是错误的方法。我想要一个声明,如果它确实存在,它接受重新声明该变量。
你不能重新声明变量,也不能测试它们是否已经被声明(至少不是我曾经能够找到的)。但是,无论如何您都不需要这样做。如果您提前知道变量名称,只需在流程开始时将它们全部声明即可。然后,在整个脚本中使用它们。
例如:
--------------------------------
-- 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)
通过阅读您的问题,我认为您正在应用程序中构建 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 有效。