如何使用SqlCommand参数指定选择查询的模式名称

时间:2012-02-01 10:37:13

标签: c# sql-server tsql ado.net

我们数据库中Schema的名称是动态的。为什么要赢得以下工作呢?

public void ReadVersion(string connString, string schemaName) 
{
    string selectCommand = "SELECT major FROM [@SchemaName].[version]");
    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    {
        using (SqlCommand cmd = new SqlCommand(selectCommand, sqlConn)) 
        {
            sqlConn.Open();
            cmd.Parameters.AddWithValue("@SchemaName", schemaName);
            object result = cmd.ExecuteScalar();
        }
    }
}

执行命令时,不替换参数值。这是SqlCommand Parameters的限制吗?

2 个答案:

答案 0 :(得分:4)

不能在纯SQL中执行以下操作(因此忽略所有ADO.Net开销):

DECLARE @SchemaName sysname
SET @SchemaName = 'dbo'
SELECT major FROM @SchemaName.[version]

原因很简单。在FROM之后SQL需要的是名称。您尝试提供的是字符串。 SQL Server 不会随机开始在字符串内部查看它们是否与其他构造类似。

对于您的卫生查询,假设您保持架构名称正确,只需在架构名称之前使用简单的正则表达式(例如^[A-Z][A-Z0-9]+$应该足以满足大多数用途)。确保使用白名单(允许的字符)而不是黑名单。

答案 1 :(得分:3)

  

这是SqlCommand Parameters的限制吗?

是的,这是一个限制。在ADO.NET中,您不能使用模式的参数(诸如表名和列名)。你最好的选择是使用字符串连接,结果显然是你自己的注射过滤。