SqlParameter不能使用模式名称

时间:2015-08-04 08:55:30

标签: c# sql-server sqlparameters

我正在尝试使用SQLParamaters来构造我的SQL命令。当我在“where”子句中使用它时它工作正常但在用作模式名称的一部分时失败。以下是带有问题参数代码的示例SQL字符串。我没有显示@lastId参数的代码,因为它有效并且与下面的代码相同。

SQL字符串:

select * from [Exchequer].[@companyId].[CUSTSUPP] where acCode = @lastId

用于插入companyId参数的代码:

var cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;

var param = cmd.CreateParameter();
param.SqlDbType = SqlDbType.Text;
param.ParameterName = "@companyId";
param.Value = companyId;
cmd.Parameters.Add(param);

var reader = cmd.ExecuteReader();

3 个答案:

答案 0 :(得分:1)

SQL参数不能应用于数据库/模式/表。您可能需要手动将模式设置为SQL字符串,并注意SQL注入。

例如,使用其他查询检查@companyId,如果存在,则构造SQL。

SELECT * FROM sys.schemas WHERE name = @companyId

答案 1 :(得分:0)

您不能将参数用作架构或表名。您必须以动态方式创建查询字符串:

strinq query = "select * from [Exchequer].[" + companyId + "].[CUSTSUPP] where acCode = @lastId";

答案 2 :(得分:0)

您无法在sql server中参数化标识符 解决它的一种方法是创建动态sql(具有所有缺点)。

另一种方法是创建一个存储过程,该存储过程将根据您发送给它的参数为每个模式执行select查询。
像这样:

create procedure SelectCUSTSUPP
(
    @SchemaName sysname,
    @acCode int
)
AS

IF @SchemaName = 'SchemaA'
    SELECT * FROM [Exchequer].[SchemaA].[CUSTSUPP] where acCode = @acCode 

IF @SchemaName = 'SchemaB'
    SELECT * FROM [Exchequer].[SchemaB].[CUSTSUPP] where acCode = @acCode 

IF @SchemaName = 'SchemaC'
    SELECT * FROM [Exchequer].[SchemaC].[CUSTSUPP] where acCode = @acCode 


GO