C# 将tablename传递给存储过程c

C# 将tablename传递给存储过程c,c#,stored-procedures,C#,Stored Procedures,我是编程新手,现在正在使用Visual Studio编程。我正试图从用户那里获取一个像google.com这样的站点名称,并在我的表中搜索该站点名称。我有不同的域表,如.com、.org等 所以,我试图编写这个存储过程,它从一个没有实际表名的表中进行选择。我试图将表名从输入传递到存储过程。这是我的存储过程: CREATE PROCEDURE test @link nvarchar(50) AS SELECT * FROM @link 我定义了linksg集合,得到如下

我是编程新手,现在正在使用Visual Studio编程。我正试图从用户那里获取一个像google.com这样的站点名称,并在我的表中搜索该站点名称。我有不同的域表,如.com、.org等

所以,我试图编写这个存储过程,它从一个没有实际表名的表中进行选择。我试图将表名从输入传递到存储过程。这是我的存储过程:

CREATE PROCEDURE test
    @link nvarchar(50)
AS
    SELECT * 
    FROM @link
我定义了linksg集合,得到如下结果:

public string linksg
{
    get { return link; }
    set { link = value; }
}
这就是我在函数中定义linksg的方式我的search\u sitedomain函数获取一个类似.com的域,并提供一个指向一个表的链接,该表包含类似于.com的sitename表:

public void search_sitedomain()
{
    SqlConnection con = new SqlConnection("Data Source=SM;Initial Catalog=mohandesi-net;Integrated Security=True;Pooling=False");

    SqlCommand cmd = new SqlCommand("search_sitedomain", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@domain", domain);

    con.Open();
    string link = Convert.ToString(cmd.ExecuteScalar());
    linksg = link;
    MessageBox.Show(link);
}
search_sitedomain函数工作得非常好,并返回链接,但我的存储过程工作不正常,因为它无法用.com之类的表名替换@link


那么,我做错了什么呢?

在我看来,参数化的表名是一个巨大的安全漏洞,但可以按如下方式执行:

CREATE PROCEDURE test
@link nvarchar(50)
AS
EXEC ('SELECT * FROM dbo.['+@link+']');

不能参数化对象名称,只能参数化值。您可以动态构建一个字符串,并将该字符串作为SQL查询执行。但是,更重要的是,为什么?为什么要在多个表中存储相同的数据?将您的网站放在一个表中,然后从中选择。从您所描述的数据库设计来看,这似乎是一个问题,但是您可以使用动态sql执行此select语句,尽管这不是一个理想的解决方案。有没有理由不将域数据存储在另一个表中,然后根据需要将它们连接起来?@David hi David。我们必须使用递归DNS查询,所以我必须有一个根表,它是空的,并且只指向一个域tables@DavidB你好,大卫,谢谢你的回复。如果您知道如何使用动态sql实现这一点,您可以回答我的问题吗?是的,我在第一条评论中解释了原因,如果你必须,至少使用