这是一个示例查询:
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
,但是有没有办法运行此查询?
答案 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);
}