如何通过SqlCommand运行具有声明语句的SQL?

时间:2019-02-21 07:40:22

标签: c# sql sql-server ado.net

这是一个示例查询:

declare @tempTable table 
(
    Id bigint
)

-- populating with temp Ids

select *
from TargetTable
where Id not in 
(
    select Id 
    from @tempTable
)

这是C#代码:

public DataTable Get(string sql)
{
    var dataTable = new DataTable();
    using (var connection = new SqlConnection(connectionString))
    using (var command = new SqlCommand())
    {
        connection.Open();
        command.Connection = connection;
        command.CommandText = sql;
        var dataReader = command.ExecuteReader();
        dataTable.Load(dataReader);
    }
    return dataTable;
}

运行此代码将引发异常,并抱怨:

  

关键字'declare'附近的语法不正确。
  语法不正确   ')'。

我知道可以使用join代替@tempTable,但是有没有办法运行此查询?

2 个答案:

答案 0 :(得分:0)

您可以创建查询的存储过程,然后将其添加到代码中。

 command.CommandType = CommandType.StoredProcedure;

然后使用exec命令

command.CommandText = "exec procedureName"

如果您的查询位置在数据库本身中。

答案 1 :(得分:0)

可以使用SqlDataAdapter对象来填充DataTable,如下所示。使用SqlCommand.ExecuteReader()方法代替调用SqlDataAdapter.Fill()。在此示例中,Fill()方法的参数是将要填充的DataTable。尽管此方法适用于您使用表变量发布的查询,但我强烈建议将其转换为存储过程,并从中填充DataTable。此外,除非使用临时表发送到表变量中的数据量很小,否则将提供比表变量更多的功能(更准确的统计信息,更好的DML性能,ROLLBACK参与等),并且d建议也使用临时表。

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            DataTable dataTable = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand command = new SqlCommand(cmd, connection);

            da.SelectCommand = command;
            connection.Open();
            da.Fill(dataTable);
        }

存储过程调用:

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            DataTable dataTable = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter();

            //use SP name for command text
            SqlCommand command = new SqlCommand("usp_ProcedureName", connection);

            //stored procedure command type
            command.CommandType = CommandType.StoredProcedure;
            da.SelectCommand = command;
            connection.Open();
            da.Fill(dataTable);
        }