首页 > 解决方案 > 将字符串作为表类型从 c# 代码传递到存储过程

问题描述

我想将表作为字符串作为参数传递到存储过程中,并希望从该特定表中检索数据,例如,我制作了一些按年份计算的表,例如 purchase20162017、transfer20162017。所以问题是这个我创建了一个下拉框,我在其中显示了年份列表,例如 2016-2017,2017-2018,2018-2019 用户从下拉框中选择年份并单击一个名为生成分类帐按钮的按钮。所以我像这样从这个下拉框中取出一个字符串

string str = DropDownList1.SelectedItem.ToString();
str = str.Replace(@"-", "");
string purdtb = "purchase" + str;

现在我在 purdtb 中有确切的表,但它是字符串,我想将此字符串值作为参数传递给存储过程。请告诉我如何执行此操作,以便我可以将此字符串转换为表名。

标签: c#stored-procedures

解决方案


有2种方式。

A) 最好的是:

string connectionString =
        ConsoleApplication1.Properties.Settings.Default.ConnectionString;
    //
    // In a using statement, acquire the SqlConnection as a resource.
    //
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        //
        // Open the SqlConnection.
        //
        con.Open();
        //
        // The following code uses an SqlCommand based on the SqlConnection.
        //
        using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine("{0} {1} {2}",
                    reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
            }
        }
    }

在 Dogs1 中放置您的表,使用变量通过代码修改查询。当您可以使用变量管理代码中的所有内容时,为什么要在存储过程中放置​​非常尴尬的动态表名?

B)第二种方式(不好但有效):

在存储过程sp_executesql中使用,将表名作为参数传递,并在存储过程中构建查询,如文档中所示并捕获结果。

这样,您可以逐个构建查询并将所需的所有内容放入其中(SQL 保留关键字除外,无论如何您都应该小心)。

declare @SqlString nvarchar(2000)
declare @ParamDef nvarchar(2000)

set @SqlString = N'exec proc1 @param1, @param2, @param3'

set @ParamDef = N'@param1 bit, @param2 bit, @param3 bit'

EXECUTE sp_executesql @SqlString ,@ParamDef, @param1 = 0, @param2 = 1, @param3 = 1

解释一下, sp_executesql 的工作原理是这样的

EXECUTE sp_executesql
   N'proc1',                                 -- SQL
   N'@param1 bit, @param2 bit, @param3 bit', -- DECLARE
   @param1 = 0, @param2 = 1, @param3 = 1     -- VALUES

哪个被翻译成

EXECUTE sp_executesql
   N'proc1',                                 -- SQL
   N'@param1 bit, @param2 bit, @param3 bit', -- DECLARE
   @param1 = 0, @param2 = 1, @param3 = 1     -- VALUES

-- DECLARE
  declare @param1 bit, @param2 bit, @param3 bit
-- VALUES
  select @param1 = 0, @param2 = 1, @param3 = 1
-- SQL
  proc1

3)最坏的情况:

通过 Sqlcommand 从 C# 代码调用 sp_executesql


推荐阅读