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

时间:2015-03-16 16:29:43

标签: c# sql sql-server ssms sqlcmd

我正在尝试创建类似于SQL Server Management Studio的内容。

我希望能够在同一个连接上运行多个查询,就像在SSMS中的同一个标签中一样,但是从c#开始,每个SqlCommand都会单独执行,即使是相同的SqlConnection,所以他们可以&# 39;看到彼此DECLARE'

示例:如果您运行两个查询:

DECLARE @ted varchar(100) = 'Ted A';
SELECT @ted as [Query1];

和另一个

SELECT @ted as [Query2];

如果按顺序在SSMS标签中运行这两个,您应该得到两个正确的结果,每个查询一个。

但问题是,如果我有一个SqlConnection而我创建了两个SqlCommand个对象,那么即使它们是相同的连接,它们也看不到@ted变量

如何创建与sql server数据库的连接,使其行为类似于SSMS选项卡,因为每个后续查询都在同一范围内,因此我可以在所有查询中使用@variables

注意:也可以在SQLCMD实用程序中找到与SSMS相同的行为。

编辑:我刚刚意识到我所问的不是SSMS是如何工作的,这实际上是不可能的。 你应该能够从同一个连接访问#tables等,但不能访问@variables

2 个答案:

答案 0 :(得分:0)

您应该将SSMS中的单个查询窗口视为大致等同于单个SQLCommand,并将SSMS的单个实例大致等同于单个SqlConnection。 TSQL变量具有范围而非连接范围。

SQLCommand执行一批TSQL,可能包括多个可执行语句。您可以将两个查询简单地放在一个命令中。

现在,如果您希望命令从多个select语句返回多个值,则可以使用SqlDataReader的Ne​​xtResult方法。这将移动到下一个语句的结果集。处理每个语句的结果,然后使用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();

希望这有帮助

答案 1 :(得分:0)

DECLARE的范围是命令,而不是连接。如果要重用声明,则需要使用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());
        }
    }
}