只是存储过程中的一列

时间:2012-02-27 16:51:21

标签: c# asp.net sql-server stored-procedures

我在SQL Server中有这个存储过程;

CREATE PROC GetChild
    @Child_ID int
AS
    SELECT * FROM Children WHERE Child_ID = @Child_ID

我从C#调用此存储过程。

我想知道,如果可以从此表中调用一列而不是从C#调用整个记录。?

5 个答案:

答案 0 :(得分:2)

您只有三个选择。

  1. 重写Stored过程以返回所需的列。

    e.g。 SELECT foo from Children Where Child_id = @Child_ID

  2. 使用DataReader,只需从中获取所需的列

    直接使用阅读器

    while (reader.Read())

      `Console.WriteLine("{0}", reader.GetInt32(0));`
    

    使用Linq扩展方法,它允许您对结果进行过滤和排序,以及只获取所需的列。

    var List = rdr.Cast<IDataRecord>() .Select(s => s.GetInt32(0)).ToList();

  3. 放弃存储过程并针对表写入Select语句。请参阅Pranay's answer

答案 1 :(得分:2)

假设您的意思是返回一列,如果这是您的存储过程的样子,那么不。它将始终将所有列返回给客户端。

您可以简单地忽略不需要的返回列。或者,您可以将存储过程更改为仅返回一列。但按原样,它总是返回所有这些。

答案 2 :(得分:1)

只需写下面的查询

select columnname from Children where Child_ID = @Child_ID

columnname-是您要检索的列的名称

代码

SqlConnection mySqlConnection =new SqlConnection("server=(local)\\SQLEXPRESS;database=MyDatabase;Integrated Security=SSPI;");

SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
mySqlCommand.CommandText ="select columnname from Children where Child_ID = @Child_ID";

 mySqlCommand .Parameters.Add("@Child_ID", SqlDbType.Int);
 mySqlCommand .Parameters["@Child_ID"].Value = idvalue;
 mySqlConnection.Open();

 SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(CommandBehavior.SingleRow);


while (mySqlDataReader.Read()){
  Console.WriteLine("mySqlDataReader[\" columnname\"] = " +
    mySqlDataReader["columnname"]);
}

mySqlDataReader.Close();
mySqlConnection.Close();

答案 3 :(得分:0)

使用SqlDataReader

SqlConnection DbConn = new SqlConnection(YourConnStringHere);
SqlCommand ExecStoredProc = new SqlCommand();
ExecStoredProc.CommandType = CommandType.StoredProcedure;
ExecStoredProc.CommandText = "GetChild";
ExecStoredProc.Connection = DbConn;
ExecStoredProc.Parameters.AddWithValue("@ChildID", YourChildId);

using (DbConn)
{
    DbConn.Open();
    using (SqlDataReader sdr = ExecStoredProc.ExecuteReader())
    {
        while(sdr.Read())
            // reference your column name like this:
            // sdr.GetString(sdr.GetOrdinal("YourColumnName"));
    }
}

您可以引用SqlDataReader.Read()方法返回的任何列。同样,如果您要查找整数值:

int someInt = sdr.GetInt32(sdr.GetOrdinal("YourColumnName"));

答案 4 :(得分:0)

从这个帖子(Insert results of a stored procedure into a temporary table),您可能想尝试OPENROWSET。

首先,配置您的数据库,

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

然后,取决于您的连接:

SELECT  yourcolumnname
  FROM    
OPENROWSET(
      'SQLNCLI', 
      'server=yourservername;database=yourdbname;uid=youruserid;pwd=youruserpwd',
      'EXEC [GetChild] yourchildid'
       )

SELECT  yourcolumnname
  FROM    
OPENROWSET(
      'SQLNCLI', 
      'server=yourservername;database=yourdbname;Trusted_Connection=yes',
      'EXEC [GetChild] yourchildid')

在仅检索一行时,我不会使用此解决方案。表现真的很糟糕。 为了检索大量的行,这应该可以胜任。