C# 使用相同的T-SQL变量在同一连接上进行多个查询
我正在尝试创建类似于SQLServerManagementStudio的东西 我希望能够在同一个连接上运行多个查询,就像在SSMS的同一个选项卡中一样,但是从c#每个C# 使用相同的T-SQL变量在同一连接上进行多个查询,c#,sql,sql-server,ssms,sqlcmd,C#,Sql,Sql Server,Ssms,Sqlcmd,我正在尝试创建类似于SQLServerManagementStudio的东西 我希望能够在同一个连接上运行多个查询,就像在SSMS的同一个选项卡中一样,但是从c#每个SqlCommand都是单独执行的,即使使用相同的SqlConnection,它们也无法看到彼此DECLARE 示例:如果运行两个查询: DECLARE @ted varchar(100) = 'Ted A'; SELECT @ted as [Query1]; 另一个呢 SELECT @ted as [Query2]; 如果您在
SqlCommand
都是单独执行的,即使使用相同的SqlConnection
,它们也无法看到彼此DECLARE
示例:如果运行两个查询:
DECLARE @ted varchar(100) = 'Ted A';
SELECT @ted as [Query1];
另一个呢
SELECT @ted as [Query2];
如果您在SSMS
选项卡中按顺序分别运行这两个,您应该会得到两个正确的结果,每个查询一个
然而,我的问题是,如果我有一个SqlConnection
,并且我创建了两个SqlCommand
对象,那么即使它们是相同的连接,它们也看不到@ted
变量
如何创建与sql server数据库的连接,使其行为类似于SSMS选项卡,因为每个后续查询都在同一范围内,因此我可以在所有查询中使用@variables
注意:与SSMS中相同的行为也可以在SQLCMD
实用程序中找到
编辑:我刚刚意识到我问的不是SSMS是如何工作的,这实际上是不可能的。
您应该能够从相同的连接而不是@variables访问#表等您应该认为SSMS中的单个查询窗口大致相当于单个SQLCommand,而SSMS的单个实例大致相当于单个SqlConnection。TSQL变量具有批处理作用域而不是连接作用域 SQLCommand执行一批TSQL,可能包括多个可执行语句。您可以简单地将两个查询放在一个命令中 现在,如果希望命令从多个select语句返回多个值,那么可以使用SqlDataReader的NextResult方法。这将移动到下一条语句的结果集。处理每个语句的结果,然后使用NextResult对结果集进行交互 简单例子
queryText = "Declare @Ted Varchar(100) = 'Ted A'; SELECT @ted --Or some other query using @ted; Select @ted --or yet another query using @ted;"
command = new SqlCommand(queryText);
reader = command.ExecuteReader();
do
{
//Result set handling code goes here
do
{
//Record level handling code goes here
} while reader.Read();
//More result set handling code goes here
} while reader.NextResult();
希望这有帮助声明的作用域是命令而不是连接。如果要重用声明,则需要使用T-SQL解析器 否则,您可以从以下内容开始:
var commandText =
"DECLARE @ted varchar(100) = 'Ted A';" +
"SELECT @ted as [Query1];" +
"SELECT @ted as [Query2];";
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(commandText, connection))
{
using(var reader = command.ExecuteReader())
{
// There are two result sets and each result set has one result.
do
{
// You will need to use the Schema Table to dynamically
// generate the results view
var schema = reader.GetSchemaTable();
// "ColumnName" column will have the "Query1" and "Query2"
var columnNameColumn = schema.Columns["ColumnName"];
var row = schema.Rows[0][columnNameColumn];
Console.WriteLine(row);
// Now we write the results
while(reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
while(reader.NextResult());
}
}
}
如果您运行
选择@ted作为[Query2]
此查询未声明@ted
您将得到一个错误为什么要这样做?我希望能够按顺序运行两个查询,但要间隔一段时间。因此,请选择一个查询来声明变量。然后运行它,当您选择第二个查询来选择值时,您仍然可以访问同一个查询中的@变量tab@EhsanSajjad这是一个大学项目。一旦完成,它将成为SSMs的开源跨平台替代方案。是的,我知道这一点,我要求behavure在同一个选项卡上运行多个查询。希望这是有意义的。你看到关于NextResult的部分了吗?是的,我知道我可以做选择1作为一个;选择2作为b代码>这不是我想要的。然后我的建议是更改项目..:PI刚刚意识到所问的问题是错误的,即功能不存在。是的,但是SSMS中存在此功能。我想知道如何模仿这种行为。我希望创建一些连接(tab),然后我需要一种机制向它们提交查询,但在相同的范围内。与SSMS中一样,作用域是选项卡,您可以在同一作用域中分别执行多个语句。SSMS中的默认行为是提交整个选项卡并返回结果。您也可以在选项卡中选择一些文本并提交,但是如果您没有在查询中突出显示delcares,则会出现错误。好的,您可以在多个连接中使用相同的#表吗?我错了,如果您没有选择它们,您就不能共享@变量