Sql server 我想让存储过程在运行时取表名并返回此表中的最后一行

问题描述

我正在尝试创建一个存储过程以在存储过程中实现以下功能

CREATE PROCEDURE [dbo].[spByTableNameReturnLastRowNew]
    @tableName nvarchar(50)
AS
BEGIN
    DECLARE @SelectLastRow NVARCHAR(100)

    SET @SelectLastRow = 'SELECT TOP 1 * FROM ' + QUOTENAME(@tableName)+ ' ORDER BY AutoNo DESC'

    EXECUTE(@SelectLastRow)

    RETURN 
END

这是可行的,但是当通过实体框架调用它时,结果变量返回 INT 数据类型我想返回行(对象)以使用数据而不是 int。

这是使用实体框架中的存储过程的代码

var result = milestoneArhEntities.spByTableNameReturnLastRowNew(TableName);

解决方法

这里的 ORM 需要(提前)理解表格布局,以便将结果网格解释为对象。因此,你真的不能这样做:

var result = milestoneArhEntities.spByTableNameReturnLastRowNew(TableName);

因为 ORM 不可能知道这意味着什么个人方法通常可以配置为返回,例如,Order(或List<Order>)或Customer(或List<Customer>)等,但这并不能真正帮助您,因为表结构仅由 tableName 参数定义。

这里没有什么好的方法可以做你想做的事,但我不相信你想要的东西无论如何,在一般意义上。与内联 SQL 相比,我也不确定 SP 在这里为您做了多少。

可以编写多个方法,即

var customer = milestoneArhEntities.GetLastCustomer();
var order = milestoneArhEntities.GetLastOrder();

它们是特定于表/类的。 ORM 应该没问题。

,

我建议使用 DataTable 对象来获取数据。

DataTable table = new DataTable();
SqlConnection con = (SqlConnection)milestoneArhEntities.DataBase.Connection;
using(var cmd = new SqlCommand("spByTableNameReturnLastRowNew",con))
using(var da = new SqlDataAdapter(cmd))
{
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("tableName",TableName);
   da.Fill(table);
}