很抱歉浪费您的时间! :(
我正在尝试读取SQL变量上一系列操作的结果,这是我试图从中获取值的查询:
DECLARE @Count INT = 0
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table1' AND xtype = N'U')
BEGIN
SET @Count = @Count + (SELECT COUNT(*) FROM Table1)
END
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table2' AND xtype = N'U')
BEGIN
SET @Count = @Count + (SELECT COUNT(*) FROM Table2)
END
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table3' AND xtype = N'U')
BEGIN
SET @Count = @Count + (SELECT COUNT(*) FROM Table3)
END
SELECT @Count
基本上,它检查一堆表(可能不存在)中是否有行。
List<string> queries = new List<string>();
foreach (var table in tables)
{
queries.Add(string.Format(@"IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'{0}' AND xtype = N'U')
BEGIN
SET @Count = @Count + (SELECT COUNT(*) FROM {0})
END", table.Name.Trim()));
}
var queryString = string.Format(@"DECLARE @Count INT = 0 {0} SELECT @Count
GO", string.Join(" ", queries));
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
//I also tried these methods using Dapper:
// int count = connection.Query<int>(queryString);
// int count = (int)connection.ExecuteScalar(queryString);
SqlCommand cmd = new SqlCommand(queryString, connection);
using (SqlDataReader dr = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(dr);
//dt has one row where the data is 0, not the sum as i want it
}
connection.Close();
}
问题是,无论我如何尝试将结果加载到C#中,总是会返回原始值(在这种情况下,返回0,但是如果我在查询中更改它,更改将反映在结果中)。
我希望返回的值是所有这些查询的总和:
(SELECT COUNT(*) FROM X)
不幸的是,不可能将查询放入存储过程中,任何人都知道下一步该怎么做?我已经坚持了一段时间...
SQL Server版本是SQLServer 2014
答案 0 :(得分:0)
编辑以反映问题编辑:
显示更改,并:
//dt has one row where the data is 0, not the sum as i want it
然后:答案为零。您正在以一种可以查询的方式来查询它(DataTable
过于矫kill过正,但是……嗯),但是:答案为零。
我非常确定,如果您在SSMS中运行相同的TSQL(在同一数据库中,以及同一用户):您在那也将得到零。
最终,这里的关键因素是:如何返回值?在这种情况下,您正在做:
SELECT @Count
这意味着它将作为结果网格返回-即,它是一个 query ;所以:只要使用 query API,就可以了。这包括ADO.NET中的ExecuteScalar
和dapper中的QuerySingle<int>
(您已提到)。
您不能要做的是使用ExecuteNonQuery
的返回值(在精简版中为Execute
),因为这是一个不相关的值(通常是错误的,并且/或是空的和/或无用的-永远不要使用它。
答案 1 :(得分:0)
尝试使用此C#(可能存在较小的语法错误-不在VS中编写/运行它)。如果仍然得到0,则表示您正在查询一个空的数据库:
int count = 0;
using (SqlConnection connection = new SqlConnection(connectionString))
{
try{
connection.Open();
foreach (var table in tables)
{
try{
var cmd = "SELECT COUNT(*) FROM " + table;
using(var sc as new SqlCommand(cmd, connection)){
count += (int)sc.ExecuteScalar();
}
}
catch {}
}
}finally{
connection.Close();
}
}
答案 2 :(得分:-1)
最好的方法是将sql附加到命令,然后执行
int retVal = cmd.ExecuteScalar();
应该重新获得价值-尽管这是实现价值的几种方法之一。
ExecuteScalar适用于您想要返回单行和单列的实例,就像您在此处所做的那样。