我正在尝试使用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();
答案 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