Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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
C# 使用相同的T-SQL变量在同一连接上进行多个查询_C#_Sql_Sql Server_Ssms_Sqlcmd - Fatal编程技术网

C# 使用相同的T-SQL变量在同一连接上进行多个查询

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]; 如果您在

我正在尝试创建类似于SQLServerManagementStudio的东西

我希望能够在同一个连接上运行多个查询,就像在SSMS的同一个选项卡中一样,但是从c#每个
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,则会出现错误。好的,您可以在多个连接中使用相同的#表吗?我错了,如果您没有选择它们,您就不能共享@变量