我们数据库中的模式名称是动态的。为什么下面的工作不起作用?

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参数的限制吗?

最佳答案

您无法在普通SQL中执行以下操作(因此,请忽略所有ADO.Net开销):

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


原因很简单。 FROM之后SQL想要的是名称。您要提供的是字符串。 SQL Server不会随机开始在字符串内部进行对等,以查看它们是否类似于某些其他构造。

对于卫生查询,假设您保持架构名称合理,只需在信任它之前在架构名称上使用一个简单的正则表达式即可(例如^[A-Z][A-Z0-9]+$对于大多数用途就足够了)。确保使用白名单(允许的字符)而不是黑名单。

关于c# - 如何使用SqlCommand参数为选择查询指定架构名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9094370/

10-13 00:26