MySQL动态设置数据库名称并选择db.schematable

MySQL动态设置数据库名称并选择db.schematable,mysql,database,syntax,Mysql,Database,Syntax,我正在创建一个存储过程,它接受许多输入参数。我希望能够选择使用哪个数据库,然后根据如下所示的条件,我希望使用正确的where条件 我知道您不能在存储过程中使用“use”关键字,我也尝试在查询中设置@ds,但没有太大成功 我正在使用Navicat并在IDE中定义了我的参数,我的输入参数是: ICCustomerName varchar(255) ipostcode varchar(255) iaccountnumber varchar(255) imemberdbname varchar(255

我正在创建一个存储过程,它接受许多输入参数。我希望能够选择使用哪个数据库,然后根据如下所示的条件,我希望使用正确的where条件

我知道您不能在存储过程中使用“use”关键字,我也尝试在查询中设置@ds,但没有太大成功

我正在使用Navicat并在IDE中定义了我的参数,我的输入参数是:

  • ICCustomerName varchar(255)
  • ipostcode varchar(255)
  • iaccountnumber varchar(255)
  • imemberdbname varchar(255)
SQL

BEGIN
declare dbName varchar(255); --attempt at using db name passed in
select imemberdbname into dbName;
set @ds = concat(dbName,'.customers'); -- I have also tried this

if LENGTH(icustomername) > 0 THEN
    (Select customerid, customername, postcode, accountnumber from dbName.customers
        WHERE customername = icustomername);
ELSEIF len(ipostcode) > 0 THEN
    (Select customerid, customername, postcode, accountnumber from dbName.customers
        WHERE postcode = ipostcode);
ELSE 
    (Select customerid, customername, postcode, accountnumber from dbName.customers
        WHERE accountnumber = iaccountnumber);
end if;

END
我无法选择db.table以执行选择。这有可能吗?或者有更好的解决方案吗?

您可以使用一个

一个非常基本的准备语句如下所示:

SET @stat = CONCAT('SELECT * FROM ', @tab'); 

PREPARE stmt FROM @stat; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
EDIT:最基本语句的完整示例,使用if语句为'where'和'table'子句设置变量,应该没问题

EDIT2:我想您不想使用使用传入参数的语句,已编辑的查询

EDIT3:基本上完成了存储过程,您可以使用
calltest('dbname.tablename')
调用该过程,这里提供的参数是tablename/dbname.tablename

CREATE DEFINER=`user`@`%` PROCEDURE `test`(IN tbl VARCHAR(255))
BEGIN
DECLARE cols VARCHAR(255);
DECLARE conditions VARCHAR(255);

SET cols = 'customerid, customername, postcode, accountnumber';


IF LENGTH(icustomername) > 0 THEN 
SET conditions = CONCAT("customername = '", icustomername, "'");

ELSEIF len(ipostcode) > 0 THEN 
SET conditions = CONCAT("postcode = '", ipostcode, "'");

ELSE SET conditions = CONCAT("accountnumber = '", iaccountnumber , "'");
END IF;

    SET @stat = CONCAT('SELECT ', cols, ' FROM ', tbl, ' WHERE ', conditions );
    PREPARE stmt from @stat;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

-------
CALL test('tablename');

因此,对于我的查询,每个select是否都是一个单独的@stat?从我看到的情况来看,您的所有查询基本相同。您可以保留一个@stat来执行并使用变量动态设置tablename和where语句。该语句将被包装在BEGIN-END中?我刚刚编写了一个非常基本的语句,我认为您可以很好地使用它,我将在我的回答中对其进行编辑。我明白了,但我如何仍然动态设置db?我想要20个星盘?因为每次传递的db名称可能不同。